C言語関係掲示板

過去ログ

No743 "%d\n"は文字列リテラルか?

[戻る] [ホームページ]
No.9248

リテラルとメモリ
投稿者---ゆかり(2003/09/10 09:19:49)


はじめまして。

知らなくてもプログラムは書けるけど。という質問で、
恐縮ですが、リテラルについてうかがいます。

printf("%d\n", 99);

という文があったときに、「99」は整数リテラルですね?
では、「"%d\n"」は文字列リテラルですか?
だとしたら、メモリ上にはどのように領域がとられるのでしょうか?
99ではなく変数だったとしたら、違いはありますか?

メモリのあたりは理解があやふやなので・・・。
よろしくおねがいします。



No.9249

Re:リテラルとメモリ
投稿者---nop(2003/09/10 09:49:19)


>printf("%d\n", 99);
>という文があったときに、「99」は整数リテラルですね?
>では、「"%d\n"」は文字列リテラルですか?
>だとしたら、メモリ上にはどのように領域がとられるのでしょうか?
>99ではなく変数だったとしたら、違いはありますか?

文字列リテラルはプログラムの実行時に確保され、
プログラムの終了と共に解放されます。
「"%d\n"」と言う文字列リテラルは、
メモリ上のどこかに

'%'
'd'
'\n'
'\0'

と言う 4 Bytes の領域が確保され保持されます。
99 が変数かどうかには一切関係ありません。
ちなみに、

 char str[] = "abcdefg";

の「"abcdefg"」は初期化指定子であり文字列リテラルではないので、
お間違いのないように。

No.9262

Re:リテラルとメモリ
投稿者---ゆかり(2003/09/10 16:24:09)


ありがとうございました。

>'%'
>'d'
>'\n'
>'\0'

これは、「'9', '9', '\n', '\0'」という領域がとられるのかと思っていました。リテラルとprintfの機能をごっちゃにしていたみたいですね。
よくわかりました。


No.9263

Re:リテラルとメモリ
投稿者---nop(2003/09/10 16:39:44)


>リテラルとprintfの機能をごっちゃにしていたみたいですね。

printf() 関数は第一引数で示された文字列(リテラルに限らず)を一文字ずつ表示して行き、
「%」文字が出現したら、その後に続く書式文字列に従って、
引数を読み込み、書式に従って変数の内容を表示するものです。

文字列リテラルとは何の関係もありません。

No.9278

Re:リテラルとメモリ
投稿者---HEN(2003/09/11 01:07:44)


>の「"abcdefg"」は初期化指定子であり文字列リテラルではないので、

すみません。便乗質問で申し訳ないのですが、この文字列リテラルではない
"abcdefg"は、どのように領域が確保されているのでしょうか。
文字列リテラルとどう変わってくるのでしょうか。

よろしくお願いします。

No.9280

Re:リテラルとメモリ
投稿者---YuO(2003/09/11 02:28:38)


>>の「"abcdefg"」は初期化指定子であり文字列リテラルではないので、
>すみません。便乗質問で申し訳ないのですが、この文字列リテラルではない
>"abcdefg"は、どのように領域が確保されているのでしょうか。

え〜っと,文法事項上"abcdefg"は初期化指定子であり,文字列リテラルです。

ただし,初期化指定子はまさに「初期化」のためだけに使われるのですから,
初期化するためにコンパイラが使いやすい様に処理されていると思います。
例えば,"abcdefg"の場合だと,32bitコンパイラなら即値代入を二つ並べているかもしれません。

まぁ,どこかに"abcdefg"に相当する情報は存在します。


>文字列リテラルとどう変わってくるのでしょうか。

・sizeof演算子に渡される文字列リテラル
は,領域を確保する必要はありません。

・配列の初期化指定子である文字列リテラル
は,必要であれば領域を確保します。

・それ以外の文字列リテラル
は,内部結合を持つ配列として領域を確保します。


No.9283

Re:リテラルとメモリ
投稿者---HEN(2003/09/12 09:29:08)


回答、ありがとうございました。

>え〜っと,文法事項上"abcdefg"は初期化指定子であり,文字列リテラルです。

初期化方法はともかく、このような初期化指定子も、通常の文字列リテラルと
の領域と同じ認識でいいんですよね。安心しました。

>・配列の初期化指定子である文字列リテラル
>は,必要であれば領域を確保します。
>
>・それ以外の文字列リテラル
>は,内部結合を持つ配列として領域を確保します。

参考になります。
やはり言語仕様をしっかりチェックしないと、正確な知識は得られませんね…