• ベストアンサー

ポインタの場合のsizeof()

C言語の基礎かもしれませんが、質問させてください。 例えば char a[20] = "computer program"; printf("%d",sizeof(a)); とすると、char型なのでおそらく16と出力されると思うのですが、 char *a = "computer program"; と定義したとき、 printf("%d",sizeof(a)); とすると、どんな値が表示されるのでしょうか?

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

  • ベストアンサー
  • suseimei
  • ベストアンサー率35% (17/48)
回答No.5

> strlen (a)はなにを表すのか VC++ 2005でのデバッグ環境で取得した次のアセンブラーコードを参照してください。この場合のご指摘のaは、文字列の先頭アドレスを保持するポインタです。その値がそのままstrlenに渡されていますね。 printf ("%d\n", strlen(a)); 004010A5 mov eax,dword ptr [ebp-3Ch] // 文字列の先頭アドレス 004010A8 push eax 004010A9 call strlen (40115Eh) 004010AE add esp,4 004010B1 mov esi,esp 004010B3 push eax 004010B4 push offset ___xi_z+9Ch (40319Ch) 004010B9 call dword ptr [__imp__printf (4030DCh)] 004010BF add esp,8 004010C2 cmp esi,esp 004010C4 call _RTC_CheckEsp (401180h) 参考URLから公開されている情報は、このような初歩的な分析手順を紹介してくれています。覗いてみてはいかがでしょうか?

参考URL:
http://www.ttoyota.com/php/cppnovicecontents.php
mine135
質問者

お礼

2回の回答ありがとうございます。 参考URLは少しずつ読んで参考にしています。 教えていただきありがとうございます。

その他の回答 (5)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

規格上どうかではなく、自分の使っている環境で、具体的にどんな値になるかを知りたいのであれば、実際に試すのが一番です。 ただし、size_t型がunsigned int型の場合はよいのですが、それ以外の場合、printf("%d", sizeof(a));は動作が未定義になります。 正しくは、printf("%zd", sizeof(a));とするか、C99に対応していない場合はprintf("%d", (int)sizeof(a));としてください。

mine135
質問者

お礼

そういったミスが多いので、気をつけます; printf("%d", (int)sizeof(a));の方が無難ですよね。 ありがとうございました。

回答No.4

その場合の sizeof(a) は sizeof(char *) と同じです。これはこの頃のメジャーなOSや環境ではおそらく 4 になります(しかし必ず4になるとは限りません。64ビット環境では8かも知れません。16ビットや8ビットのCPUのマシンだと2かも知れません)。ポインタの長さです。

mine135
質問者

お礼

>その場合の sizeof(a) は sizeof(char *) と同じです。 そうなんですか。ありがとうございます。 もう一度復習してみます。

  • suseimei
  • ベストアンサー率35% (17/48)
回答No.3

基本的に実験してみると分かると思います。これは推測ですが、あなたはもしかすると、配列とポインタの違いのようなものをお知りになりたいのではありませんか? なら、次のサイトから公開されている情報を参照するとよいでしょう。 http://www.ttoyota.com/freetutorial/cppnovice025.htm このページの前後のページも読むと、CとC++学習上のポイントを理解できると思います。 参考になれば幸いです。

mine135
質問者

お礼

ポインタについていまひとつ理解できていなかったようです。 URL,参考にさせていただきます。 回答ありがとうございました。

回答No.2

strlen は \0で終わる文字列の長さ を返します。 sizeof は 変数が占める領域の大きさ を返します。

mine135
質問者

お礼

どうやら頭の中でごっちゃになっていたようです; 回答ありがとうございました。

回答No.1

訊くまでもない。やってみましたか? 前者は sizeof(char[20]) だから 20 じゃありませんか? やってみましたか? strlenと混同していませんか? 後者は sizeof(char*) だからポインタ(char*)が占める領域の大きさとなります。

mine135
質問者

お礼

>後者は sizeof(char*) だからポインタ(char*)が占める領域の大きさとなります。 参考になりました。もう一度復習してみます。 回答ありがとうございました。

mine135
質問者

補足

strlenと混同してしまっていました;すみません。 char *a = "computer program"; とは、この文字列の先頭アドレスが0x0001100とすると、 char *a = 0x0001100; と同じことですよね。 strlenは文字列の長さを表すものですが strlen(a)は何を表すことになるのでしょうか。

関連するQ&A

  • sizeofとポインタ

    char *p; printf("%d",sizeof(*p)); これでなぜ1が出力されるのか分かりません。お願いします。

  • ポインタのsizeofについて

    C初心者です。 ポインタ宣言させた変数をsizeof()で値を取得させて 表示させてみました。 char *cp; short int *sp; int *ip; i = sizeof(cp); printf("%d\n",i); i = sizeof(sp); printf("%d\n",i); i = sizeof(ip); printf("%d\n",i); 結果は全て4となりました。 これはなぜですか? (ただの変数として宣言すれば1、2、4となります。この理由も理解できています。)

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

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

  • sizeof

    main() { char array1[256] = "abcdefg"; char *array2 = "stuvwxyz"; printf("array1 = %d\n",sizeof(array1)); // array1 = 256 printf("array1 = %d\n",sizeof(array1)/sizeof(char)); // array1 = 256 printf("array2 = %d\n",sizeof(array2)); // array2 = 4 printf("array2 = %d\n",sizeof(array2)/sizeof(char *)); // array1 = 1 printf("array2 = %d\n",sizeof(*array2)); // array2 = 1 } となるのですが、sizeof(array1)では、配列のサイズが取得できるのですが、array2がさす配列のサイズを得るためにはどうすればいいのですが?もしくは取得デキナイのはなぜでしょうか。 それと、 sizeof(array2)では、charへのポインタをさすから4バイト。 sizeof(*array2)では、sizeof(array[0])を意味するから1バイト という解釈でいいでしょうか。

  • sizeof が分かりません!

    Cの予約語で"sizeof"がありますが、 普段おきまりで良く使っているのですが、 いまいち理解出来ないので誰か教えて下さい。 例えば、以下の場合sizeofの結果はどうなりますか? char s_aaa[]="ABCDE"; char s_bbb[4]; memset(s_bbb, '\0', sizeof(s_bbb)); memcpy(s_bbb, s_aaa, sizeof(s_bbb)); printf("s_aaa → :[%d],[%d]\n", strlen(s_aaa), sizeof(s_aaa)); printf("s_aaa → :[%d],[%d]\n", strlen(s_bbb), sizeof(s_bbb));

  • 正しいsizeofの使い方とcharのポインタについて教えてくださいm(__)m

    C言語なのですが、 例えば、次のように実験してみました。 char * rec_fld[12]; int x,y; char tt[11]; ※rec_fld[1]には”私は完全な素人” という文字が入っていると思ってください。 x = sizeof( rec_fld[1] ); strcpy( tt, rec_fld[1] ); y = sizeof( tt ); すると、xは4とかいう数字が格納されていて、 yには11という数字が格納されていました。 ttが11なのは分かりやすいのですが、 なんで、xは、文字数の14とかにならないのでしょうか? sizeofの中の書き方が違うのでしょうか? あと、char *で配列宣言するのと、charで宣言するのとは 何が違うのでしょうか? どなたか、教えて下さいませ。

  • ポインタ変数のサイズ

     いろいろC言語のことを知りたくて、次のソースを作って動かしてみました。 ★ソース(□はタブ) ◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> int main(void) { □char *s1; □int *s2; □ □s1 = (char *)malloc(1000); □s2 = (int *)malloc(1000); □ □printf("sizeof s1 = %d\n", sizeof s1); □printf("sizeof s2 = %d\n", sizeof s2); □ □printf("sizeof *s1 = %d\n", sizeof *s1); □printf("sizeof *s2 = %d\n", sizeof *s2); □ □printf("s1 = %d\n", s1); □printf("s2 = %d\n", s2); □ □printf("*s1 = %d\n", *s1); □printf("*s2 = %d\n", *s2); □ □return EXIT_SUCCESS; } ◆◆◆◆◆ ★実行結果1 ◆◆◆◆◆ sizeof s1 = 4 sizeof s2 = 4 sizeof *s1 = 1 sizeof *s2 = 4 s1 = 1323000 s2 = 1324008 *s1 = -60 *s2 = 1310916 ◆◆◆◆◆ ★実行結果2 ◆◆◆◆◆ sizeof s1 = 4 sizeof s2 = 4 sizeof *s1 = 1 sizeof *s2 = 4 s1 = 11087864 s2 = 11088872 *s1 = -60 *s2 = 11075780 ◆◆◆◆◆ ★実行結果3 ◆◆◆◆◆ sizeof s1 = 4 sizeof s2 = 4 sizeof *s1 = 1 sizeof *s2 = 4 s1 = 1519608 s2 = 1520616 *s1 = -60 *s2 = 1507524 ◆◆◆◆◆  OSはWindows Vista、コンパイラはMS Visual Studio 2010 コマンドプロンプトです。次の疑問についてご教授頂きたく、お願い致します。 (1)“sizeof s1”、“sizeof s2”の値が共に4となるのはなぜか。  char型へのポインタ、int型へのポインタとして宣言したs1、s2のサイズが同じ4になる理由が、どうしても分かりません。 (動かす前の予想は、でたらめな値になるかと思っていましたが) (2)“s1”、“s2”、“*s2”の値が毎回でたらめな値になったのに対して、“*s1”の値が毎回“-60”になったのはなぜか。  ポインタでつまずいており、いろいろ実験して体で理解したいと思っています。どうぞよしくお願い致します。

  • ポインタについてです。

    #include <stdio.h> int main (void){ char (*a)[3]; printf("a: %d\n", sizeof(a)); printf("a[0]: %d\n", sizeof(a[0])); printf("a[0][0]: %d\n", sizeof(a[0][0])); return 0; } このようなプログラムがあったとして a: 4 a[0]: 3 a[0][0]: 1 のような結果が得られました。a[]が3であるのは理解できたんですが、その他の結果があんまり理解できません・・・・ 解説をお願いします。

  • 関数に配列を渡した場合にサイズが

    C言語初心者です。 以下のように関数に配列を渡した場合、サイズが変わってしまうのは何故でしょうか。 #include "stdafx.h" void fanc(char [3]); int _tmain(int argc, _TCHAR* argv[]) { char a[] = {'a','b','c'}; printf("%d\n",sizeof(a)); // aのサイズ 3 fanc(a); return 0; } void fanc(char b[]){ printf("%d\n",sizeof(b)); // bのサイズ 4 }

  • Sizeofが分かりません

    sizeofのデータサイズがどういう風に計算されているのかよく分かりません。 例えば以下のコードですが、 union Name { char firstName[10]; char lastName[10]; }; int main() { union Name name; strcpy(name.firstName, "Dennis"); strcpy(name.lastName, "Ritchie"); printf("%d", sizeof(name)); } outputは11となります。これはなぜでしょうか? 宜しくお願い致します。