• ベストアンサー

ポインタの場合の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