🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

5回答

778閲覧

C言語のsizeofの扱い方について

AdultMr.

総合スコア14

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2019/09/24 03:00

C言語のsizeofの扱い方で分からない点があります。
下記コードを実行したところ、testのsize5、inのsize1と出力されます。
私としてはinのsize5と出力をしてほしいのですが、なぜ1と出力されるのかが分かりません。
5と出力させるためには、どのような変更をすればよいのでしょうか…?

int main(){ char *in = "test"; printf("testのsize%d\n",(int)sizeof("test")); printf("inのsize%d\n",(int)sizeof(*in)); return 0; }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

sizeof は対象のバイト数を返します

sizeof("test")は、文字列のサイズ
sizeof(*in)は、1文字のサイズとなりその結果であってます

この場合、sizeof(in) とすると、ポインタのサイズが帰るんで、
文字列のサイズを返したいのであれば、

char in[] = "test";
としたうえで、
printf("inのsize%d\n",(int)sizeof(in));
としましょう

投稿2019/09/24 03:07

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

*inchar型なので、サイズは1です。

5が得たければ、strlen(in)+1です。

もしくは、変数宣言を変更して、ポインタでなく配列にし、

C

1int main(){ 2 char in[] = "test"; 3 printf("testのsize%d\n",(int)sizeof("test")); 4 printf("inのsize%d\n",(int)sizeof(in)); 5 return 0; 6}

投稿2019/09/24 03:10

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なぜ1と出力されるのかが分かりません。

inchar *なので、逆参照した*inの型はcharです。このcharのサイズが結果となっています。

5と出力させるためには、どのような変更をすればよいのでしょうか…?

残念ながら、C言語でポインタから指し先の長さを取る、標準的な方法は用意されていません。文字列であればstrlenで文字列としての長さは取得できますが、バッファがどれだけあるかを知ることはできません。

投稿2019/09/24 03:08

maisumakun

総合スコア145975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

*inはcharのため1がかえっています。

投稿2019/09/24 03:08

SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2019/09/24 03:15

5と返す方法を書き忘れていました… 他の方が回答されているのでそちらをご参照下さい。
guest

0

ベストアンサー

蛇足ですが、C言語に“文字列”というものは存在しません。すべて、終端記号('\0')を持った文字の配列です。なので、sizeofで文字列長を知る方法はありません。otnさんが言われるようにstrlen()を使いましょう。
・・・それでも、実際のバッファの長さは、宣言を見るまで分かりませんが・・・

投稿2019/09/24 04:04

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rubato6809

2019/09/24 05:22 編集

それを言うなら「C言語に文字列型は無い」とかじゃないですか。 皆さんC言語で文字列扱ってるじゃないですかw ”Hello world!\n" のようなものを文字列定数あるいは文字列リテラルと呼んでると思います。
cateye

2019/09/24 06:02 編集

〉C言語に文字列型は無い・・・ですね。 「文字列リテラル」については、代入や更新が出来ないのでちょっと特別かも?
maisumakun

2019/09/24 06:09

文字列リテラルも、C言語のコードから見れば単なるconst char []です(もっとも、変更不可の領域に置かれるなど、コンパイラで特殊な処理を行っている例もあります)。
rubato6809

2019/09/24 12:04

それは、「文字列」リテラルは const char [] であるからC言語に文字列は無い、というご意見なの?
maisumakun

2019/09/24 12:07

自分のコメントは、「『文字列リテラル』については、代入や更新が出来ないのでちょっと特別かも?」のコメントに対するもので、「文字列と呼ぶかどうか」について議論するつもりはなかったです。
raccy

2019/09/24 21:53

>maisumakunさん Cだと文字列リテラルはconst char[]じゃなくてchar[]ですよ。リテラルが変更不可の領域にあるのでは無くて、その領域を書き替えた場合は未定義な動作になると言うだけで、コンパイルエラーにはならないという厄介者です。(C++ではconst char[]なのでコンパイル時に弾かれますが…)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問