C言語関係掲示板

過去ログ

No.978 malloc(0)の結果

[戻る] [ホームページ]
No.12754

mallocによる領域確保について
投稿者---くろ(2004/02/14 14:36:00)


こんにちは。初めての投稿です。
下記のプログラムで(1)と(2)の表示が同じだと思ったのですが、
違うアドレスでした。
0個の領域を確保出来るのでしょうか?
どなたか教えて下さい。宜しくお願いします。


#include <stdio.h>
#include <stdlib.h>

struct vertex {
int id;
};

struct edge {
int id;
struct vertex *ends[2];
};

main()
{
struct edge *p;
printf("%x\n", p); /*(1)*/

p = malloc(0*sizeof(struct edge));
if (p == NULL) {
perror(NULL);
return(-1);
}

printf("%x\n", p); /*(2)*/

free(p);

return(0);
}

No.12755

Re:mallocによる領域確保について
投稿者---とおりすがり(2004/02/14 15:04:34)


>0個の領域を確保出来るのでしょうか?

すみません。これはよく知りませんが…

> p = malloc(0*sizeof(struct edge));

このようにしている以上、「何らかの」値が代入されてしまいます。
よって、元と同じになることは、ほぼあり得ないかと。
# 当然、malloc側で元のpの値(未初期化の不定値)を知ることは出来ないし

No.12756

Re:mallocによる領域確保について
投稿者---くろ(2004/02/14 15:25:49)


>> p = malloc(0*sizeof(struct edge));
>
>このようにしている以上、「何らかの」値が代入されてしまいます。
>よって、元と同じになることは、ほぼあり得ないかと。
># 当然、malloc側で元のpの値(未初期化の不定値)を知ることは出来ないし

なるほど!わかりました。
レスありがとうございました。

No.12759

Re:mallocによる領域確保について
投稿者---YuO(2004/02/14 16:42:21)


【掲示板ご利用上の注意】をちゃんと読んでください。


>0個の領域を確保出来るのでしょうか?

malloc(0)の結果は処理系定義で,
  • 空ポインタを返す
  • 何らかの(free可能な)ポインタを返す
のどちらかになります。
つまり,malloc(0)をmalloc(1)の様に振る舞ってもよいということです。

ただし,返ってきた値が不定ではないですから,
不定値である初期化していないautoポインタ変数の値とは当然異なります。


ちなみに,ポインタを出力するには,%pを使います。
#%xはよくある間違い。

No.12760

Re:mallocによる領域確保について
投稿者---くろ(2004/02/14 17:33:13)


>【掲示板ご利用上の注意】をちゃんと読んでください。

環境について勉強不足でした。すみませんでした。

ポインタを表示するときに%pではなく%xを使うと,
OSによっては表示できないことがあるということですよね?

No.12762

Re:mallocによる領域確保について
投稿者---YuO(2004/02/14 18:59:40)


>>【掲示板ご利用上の注意】をちゃんと読んでください。
>環境について勉強不足でした。すみませんでした。

ソースをはるときはちゃんと変換ツールを使うように,ということです。


>ポインタを表示するときに%pではなく%xを使うと,
>OSによっては表示できないことがあるということですよね?

OSではなく,コンパイラによっては,です。

そもそもポインタに対して%xを適用した場合,その動作は未定義とされています。
つまり,ディスクをフォーマットしようが何をしようが,
そのコンパイラに付属しているライブラリはあくまで「標準準拠」となります。

もちろん,大抵のコンパイラに付属するライブラリにおいて,
ポインタに対して%x適用した場合,ポインタの値を16進数で表示しようとしますが,
sizeof(int) == sizeof(void *)とは限らないので,
異なった場合は当然問題が起きます。


No.12765

Re:mallocによる領域確保について
投稿者---くろ(2004/02/14 19:10:49)


わかりました。
丁寧な御説明ありがとうございました。
これからもっと勉強を頑張ります。