ページ 1 / 1
ポインタのサイズ
Posted: 2009年5月01日(金) 09:42
by 研修生
ポインタのサイズについてご質問します。
int x[5];と宣言をすると、これのサイズsizeof(x)は20になります。※開発環境はVisualC++6.0です。
型はint *[5]でサイズが4つの配列が5個あるので4x5=20というのが出てきます。
次に配列にアドレス演算子&をつけます。配列にアドレス演算子&をつけると配列全体へのポインタになります。
これのサイズsizeof(&x)も20になります。型はint (*)[5]になり前者とは異なり、5個の配列へのポインタ
ということになります。これはあくまでポインタなのですがこのポインタのサイズが20になる理由を教えて下さい。
直感的にはわかるのですが、ちゃんと理解しておきたいのでお願いします。
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 10:16
by toyo
ポインタなのに20になる方がおかしい気がします
Cygwin の gccと Visual C++2008ではsizeof(&x)は4になりました
sizeof(x)についてはそういう決まりがあるので配列のサイズになります
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 10:22
by 研修生
debugでsizeof(&x)の中身自体をみると4でしたがいざ実行したら20になりました
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 10:31
by box
> debugでsizeof(&x)の中身自体をみると4でしたがいざ実行したら20になりました
そのソースコードを見せてください。
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 10:36
by 研修生
int main()
{
int x[5];
printf("%u",(unsigned)sizeof(&x));
return 0;
}
です
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 10:42
by Blue
>開発環境はVisualC++6.0です。
バグらしい。
http://f4.aaa.livedoor.jp/~pointc/No.22309.html
どうせ、適切な回答がもらえないとかいってまるちぽすとするんだろうな
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 10:59
by Blue
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 14:48
by 研修生
バグでしたか。納得です。
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 18:58
by dic
こういうことです
#include <stdio.h>
int main()
{
int x[5];
printf("xのサイズ:%u\n",(unsigned)sizeof(&x));
printf("x[0]のサイズ:%u\n",(unsigned)sizeof(&x[0]));
return 0;
}
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 19:10
by dic
と思ったんですが
下のコードは期待どおりには動いてくれませんね
#include <stdio.h>
int main()
{
char c[5];
printf("cのサイズ:%u\n",sizeof(&c));
printf("c[0]のサイズ:%u\n",sizeof(&c[0]));
return 0;
}
VC++6.0 のバグでしょうかね
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 19:13
by dic
返答者が頭がこんがらがって・・・
#include <stdio.h>
int main()
{
char c[5];
printf("cのサイズ:%u\n",sizeof(&c));
printf("c[0]のサイズ:%u\n",sizeof(&c[0]));
printf("c[0]のサイズ:%u\n",sizeof(c[0])); // ←これ
return 0;
}
char c[5]
&c[0] は アドレスなので4バイトですね
c[0] が 1バイトですね
すいません
バグではないですね
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 19:52
by dic
うわっちゃ~
またミスってますね
No:32948 の返信は微妙に間違ってます
正確なソースは以下のようになります
#include <stdio.h>
int main()
{
char c[5];
printf("cのサイズ:%u\n",sizeof(&c));
printf("c[0]のアドレスのサイズ:%u\n",sizeof(&c[0]));
printf("c[0]のサイズ:%u\n",sizeof(c[0]));
int x[5];
printf("xのサイズ:%u\n",sizeof(x));
printf("x[0]のアドレスのサイズ:%u\n",sizeof(&x[0]));
printf("x[0]のサイズ:%u\n",sizeof(x[0]));
return 0;
}
ポインタでつまづくとは・・・
私もまだまだですね
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 20:12
by dic
なんかひとり勘違いをしていたようですね
#include <stdio.h>
int main()
{
int x[5];
printf( "xのサイズ:%u\n",sizeof(&x));
printf( "x[0]のアドレスサイズ:%u\n", sizeof(&x[0]) );
printf( "x[0]のサイズ:%u\n", sizeof(x[0]) );
int y;
printf( "yのサイズ:%u\n", sizeof(&y) );
return 0;
}
int x[5] と配列を宣言したので
sizeof(&x) としたら int x[5] の全体のサイズを返すので 20 です
sizeof(&x[0]) = 4 byte
sizeof(&x[1]) = 4 byte
sizeof(&x[2]) = 4 byte
sizeof(&x[3]) = 4 byte
sizeof(&x[4]) = 4 byte
合計20バイトです
int x と単品で宣言し
sizeof(&x) としたら int x のアドレスのサイズを返すので 4 です
もうすこし char でポインタの勉強をし、
理解できたら int型にチャレンジした方が良いかと思います
Re:ポインタのサイズ
Posted: 2009年5月01日(金) 23:27
by YuO
お願いだから「ポインタのサイズ2」の私の投稿 (No.32944) を読んでほしい……。
> int x[5] と配列を宣言したので
> sizeof(&x) としたら int x[5] の全体のサイズを返すので 20 です
&xはint (*)[5]型の値,つまりポインタなのでVC++6の場合は4を返すのが「本来」正しいです。
sizeof(x)は20を返すのが正しいですが。
> もうすこし char でポインタの勉強をし、
> 理解できたら int型にチャレンジした方が良いかと思います
これはそっくりそのままdicさんに跳ね返ってきますよ。
Re:ポインタのサイズ
Posted: 2009年5月02日(土) 04:37
by dic
int x[5];
sizeof(&x) が20を返し
sizeof(x) も20を返すのでおかしいのではないのか?
ということですね
ようやく理解できました