• ベストアンサー

ポインタを定義したらなぜsizeofで容量が表示できる?

char *sz と定義しても実体はメモリに確保されていないはずなのに なぜ printf("%d",sizeof(*sz))でちゃんと1が表示されるんでしょうか? また、 sz = malloc( 100 )で printf("%d",sz)で100ではなく4となってしまうのはなぜですか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

■なぜprintf("%d",sizeof(*sz))でちゃんと1が表示されるんでしょうか? sizeof演算子はプログラム実行時に()内の計算を行っているのではなく、 コンパイル時に()内のメモリのサイズを数値に置き換えるものです。 つまり、  sizeof(*sz) は sizeof(*(char*))  sizeof(*(char*)) は sizeof(char) と、コンパイラが判断し、 sizeof(*sz)が「1」という数値に置き換えられます。 #defineみたいなものだと思ってもいいです。 質問者さんの書いた  printf("%d",sizeof(*sz)) という文はコンパイルに掛けられた時点で  printf("%d",1) というように置き換えられてプログラムは実行されてしまいます ■printf("%d",sizeof(sz))で100ではなく4となってしまうのはなぜですか? 例えば、char c[100]と定義してsizeofを使うと  sizeof(c) = sizeof(char[100]) = 100byte と、ちゃんと「100byte分のメモリサイズですよ」と認識はしてくれます。 これはコンパイルした時点でchar型変数100個分の配列だと決まっているからです。 が、ポインタの指しているアドレスがどれくらいのメモリサイズを持つものかは コンパイルの時には決まっていないのでわからないのです。 ■sz=malloc(100)で100を表示させる方法はありますか? 使用環境によっては使えないかもしれませんが、  size_t _msize( void* memblock ) というmalloc等で確保したメモリのサイズを返してくれる便利な関数があります。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.3

sizeof(*sz) は、sz の指した先のサイズです。コンパイラは、char *sz; という宣言から、szの指した物はcharだとわかるので、そのサイズである1になります。ポインタ変数szの中を中を見るわけじゃないので、実体が割り当てられているかどうかには無関係です。 >printf("%d",sz)で100ではなく4となってしまうのはなぜですか? おそらく、printf("%d",sizeof sz)の書き間違いだと思いますが、ポインタ変数szのサイズはポインタ自体のサイズなので、32bit系コンパイラでは4になります。 sizeof演算子は、プログラム実行時じゃなくてコンパイル時にわかる「型のサイズ」「変数のサイズ」を求める演算子です。動的に割り当てたメモリ領域の大きさを調べてくれる関数じゃないです。 sizeof *sz で、100が得たければ、こんな感じにするしかないですね。 typedef char buf[100]; buf *sz; printf("%d\n",sizeof *sz);

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

まずprintf("%d",sz)なら これはポインタ変数のアドレスを10進表示しますので、 sz = malloc( 100 )後ならもっと複雑な数値となるはずです。 malloc前なら値は不定ですので何が表示されるか分かりません。 printf("%d",*sz)だと話は変わります。 ポインタ参照していますので、ポインタが指すアドレスの先のメモリ100バイトの1バイト目を参照する事になります。mallocしたままだと値は不定ですので何が表示されるかは分かりません。 >また、sz=malloc(100)で100を表示させる方法はありますか? ありません。ポインタ変数はサイズを保持しないのでサイズが欲しかったら別変数に記録しておくことが必要です。 ちなみにC言語の標準関数で、アドレスからmallocしたメモリのサイズを調べる方法もありません。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

なかなか良いところに気づきました。 これが変数とポインタ変数の違いです。 sizeofは変数のメモリサイズを求めます。 sizeof(*sz) はcharポインタ型のサイズですので、ポインタ変数が4バイトのサイズであるって意味です。つまりアドレス値を保持するのに4バイト使っていると言うことです。 sz = malloc( 100 )でmallocしてもポインタ変数のサイズが変わるのではなく、ポインタ変数の指すアドレスの先のメモリが100バイト確保されただけです。 分かりますかね?

noname#141207
質問者

お礼

ご回答ありがとうございます。 イマイチわからないですね・・・ 4バイトが表示されるのはまだ納得がいきます。 ポインタの領域を確保しているのですから。 printf("%d"*sz)で1が表示されるのが分からないです。 また、sz=malloc(100)で100を表示させる方法はありますか? よろしくお願いいたします。

関連するQ&A