質問するログイン新規登録

Q&A

解決済

3回答

847閲覧

C言語、ポインタの宣言をした場合のsizeof演算子の出力結果について。

fmisaki

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1グッド

0クリップ

投稿2026/02/01 11:21

編集2026/02/01 11:31

1

0

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
Li emily👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答3

0

ベストアンサー

sizeof は原則として式を評価せず、その型の大きさを返します。
つまりこの場合は char* の大きさを返します。
ポインタの大きさとポインタが指している先のオブジェクトの大きさを混同しているのだと思います。
ポインタもポインタ型のオブジェクトなので大きさがあります。

投稿2026/02/01 11:35

SaitoAtsushi

総合スコア5853

fmisaki

2026/02/02 00:29 編集

回答ありがとうございます。 疑問が解決しました。
guest

0

質問者さん、こういう質問は、ビルド環境を提示したほうが的確な回答をしやすいです。

Windows 11、Visual Studio 2026で確認しました。

  • 64bitでビルドした場合は、8
  • 32bitでビルドした場合は、4

他の回答者さんの回答の通り、ポインターのサイズのbyte数です。

投稿2026/02/01 13:37

hiroki-o

総合スコア1749

fmisaki

2026/02/02 00:29 編集

回答ありがとうございます。 今回は、C言語プログラミング研修の紙のワークブックのソースコードと回答から疑問が生じました。 今後、前提やビルド環境を提示したり、実際にコンパイルしてみるように心がけます。
guest

0

なんの実装だろ?
GCCClangで試してみたら「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
cametan

総合スコア266

melian

2026/02/01 13:10

Raspberry Pi Zero(第一世代)に載ってるBroadcom BCM2835(ARMv6)が32bit CPUなので、その辺りではないですかね。
cametan

2026/02/01 13:15

なるほど、Raspberry Piですか。
fmisaki

2026/02/02 00:19

お忙しい中、回答ありがとうございます。 今回は、C言語プログラミング研修の紙のワークブックのソースコードと回答から疑問が生じました。 今後、できる限り前提条件の提示や講師に聞くなどの対応をとっていこうと思います。
thkana

2026/02/04 12:57

> 1byte = 4bit 少なくとも1byte(というかchar)は数字+アルファベット大文字小文字+記号類を格納するために7bit以上でなければいけないんでなかったっけ? でもって、sizeofはbyte単位なので、1byteが何bitだろうと1byteは1byte。ポインタが4byteを使用しているシステムだから4になったのだろうけれど。 ポインタのサイズが2byteとか4byteという系は確実にあって、あなたは扱わないかも知れないけれど決して「珍しい」ものではないように思います。PCより8bitの組み込みマイコンの方が「数」ではきっと多いですよ。PCの中にだって何個も入っているでしょうし。 ちなみに、charが32bitというシステムも実際にあるけれど(これは確かに「珍しい」かも。アナログデバイセスのDSP)、それだとsizeof(char*)はきっと1になるのかな。
cametan

2026/02/04 15:07

情報Thanxです。 Cリファレンスマニュアルに依ると、sizeofは「何かを計算する」と言うより、stddef.hで定義されたブツを取りに行く、ってえんで、一旦stddef.hを調べてみようか、とか思ったんだけど、実装上、それがOSのシステムに食い込んでるブツで、要は「言語処理系として独立して持ってる」ワケじゃない、って事が分かって諦めてました(笑)。 まぁ、いずれにせよ、この辺ちと闇っぽいなぁ(笑)。
hiroki-o

2026/02/04 16:24

cametanさん Windows 10までは32bit版もありました。 Windows 11は32bitアプリも動きます。 Visual Studioは32bitアプリもビルドできます。 ポインターのサイズが4byteのシステムは、別に珍しくないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問