sizeof strの表示結果が、なぜ「4」になるのかが分かりません。
C言語
1#include<stdio.h> 2#include<string.h> 3 4int main (void) 5{ 6 char *str = "Today"; 7 printf("%d",sizeof str); 8 9 return 0; 10} 11
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答3件
0
ベストアンサー
sizeof は原則として式を評価せず、その型の大きさを返します。
つまりこの場合は char* の大きさを返します。
ポインタの大きさとポインタが指している先のオブジェクトの大きさを混同しているのだと思います。
ポインタもポインタ型のオブジェクトなので大きさがあります。
投稿2026/02/01 11:35
総合スコア5830
0
質問者さん、こういう質問は、ビルド環境を提示したほうが的確な回答をしやすいです。
Windows 11、Visual Studio 2026で確認しました。
- 64bitでビルドした場合は、8
- 32bitでビルドした場合は、4
他の回答者さんの回答の通り、ポインターのサイズのbyte数です。
投稿2026/02/01 13:37
総合スコア1706
0
なんの実装だろ?
GCCやClangで試してみたら「8」になってたよ。
C
1#include<stdio.h> 2#include<string.h> 3#include<inttypes.h> 4#include<stdlib.h> 5 6int main (void) 7{ 8 char* str = "Today"; 9 printf("%" PRIu64 "\n", sizeof(str)); 10 11 return EXIT_SUCCESS; 12}
zsh
1➜ aqua clang -Wall aqua_01.c 2➜ aqua ./a.out 38 4➜ aqua
いや、「4」ってのはあり得るんだけど、特殊な環境なのかな。例えば組み込み、とかさ。
C言語の仕様だと、char型は1byteって定義なんだけど、その1byteってのはシステム依存で、システムが1byte = 4bitって定義をしてないと、「4」って結果は出てこない。
だから「4」が出てくる、ってのは珍しいシステム上でコンパイルした、って事かな。
多分。
で、提示コードはchar型へのポインタのサイズを聞いてるわけで、貴方が「代入したつもりになっている」、この場合は"Today\0"と言う文字列のサイズを訊いてるわけじゃないのね。文字列のサイズは6文字で、たしかにあなたが言う「6」になるんだけど、一方、それはchar型へのポインタのサイズと同値じゃないんだよ。
具体的にはこんな状態になっている。
{'T', 'o', 'd', 'a', 'y', '\0'} ↑ str
char型を指すポインタstrはメモリ上に連続でこの順に配置された'T'、 'o'、 'd'、 'a'、 'y'、 '\0'のうち、先頭の'T'だけを指している。
だから、コードをこんなカンジで書き換えてみれば様子は分かるでしょ。
C
1#include<stdio.h> 2#include<string.h> 3#include<inttypes.h> 4#include<stdlib.h> 5 6int main (void) 7{ 8 char* str = "Today"; 9 printf("%" PRIu64 "\n", sizeof(*str)); 10 printf("%c\n", *str); 11 12 return EXIT_SUCCESS; 13}
zsh
1➜ aqua clang -Wall aqua_01.c 2➜ aqua ./a.out 31 4T
間接参照演算子*を使って、char型へのポインタstrが指してるブツの中身を見てみれば、サイズは丁度一文字分しかなく、その文字はTとなっている。
そんなトコかね。
投稿2026/02/01 12:30
編集2026/02/02 02:33総合スコア259
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
2026/02/02 00:29 編集