printf関数の挙動について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たかお
記事: 10
登録日時: 11年前

printf関数の挙動について

#1

投稿記事 by たかお » 11年前

こんばんは。
C言語においての文字や文字列の扱いを勉強しようと考え、色々試していたところ不可解な現象が起きました。

コード:

void main(){

char b[] = "1abc";
char d[4];
d[0] = '1';
d[1] = 'a';
d[2] = 'b';
d[3] = 'c';

printf("%s\n",b);
printf("%s\n",d);

return 0;
}
このように記述したところ、実行結果が以下のようになりました。

1abc
1abc1abc

配列dに格納されている文字を表示する処理を一度しか行なっていないにも関わらず、実行結果では2回分表示されています。
一体なぜこのようなことになるのでしょうか。ご教授お願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: printf関数の挙動について

#2

投稿記事 by みけCAT » 11年前

配列dのデータの最後にNIL文字が格納されておらず、たまたまdの領域とbの領域が連続していたため、
dのデータに続けてbのデータが表示されたと考えられます。
次のプログラムを同じ環境で実行してみてください。

コード:

void main(){
 
char b[] = "1abc";
char d[4];
d[0] = '1';
d[1] = 'a';
d[2] = 'b';
d[3] = 'c';
 
printf("%p %s\n",b,b);
printf("%p %s\n",d,d);
 
return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: printf関数の挙動について

#3

投稿記事 by box » 11年前

printf関数の挙動が不審なわけではありません。

"1abc"
という、いわゆる文字列は、
'1'
'a'
'b'
'c'
'\0'
という5バイトの領域からなります。4バイトではなく。
いわゆる文字列を正しく扱うには、
きちんと'\0'で終端させることが必要です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

たかお
記事: 10
登録日時: 11年前

Re: printf関数の挙動について

#4

投稿記事 by たかお » 11年前

そういえば文字列配列の最後尾にはNULLが入るんでしたね。自動的に挿入されるのですっかり忘れていました。
文字列の配列を表示する際はNULLが見つかるまで連続したアドレスを参照するようになってるんですね。

みけCATさん、boxさん回答ありがとうございました!

box
記事: 2002
登録日時: 14年前

Re: printf関数の挙動について

#5

投稿記事 by box » 11年前

NULL

'\0'
とは別物であることに留意してください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

たかお。

Re: printf関数の挙動について

#6

投稿記事 by たかお。 » 11年前

box さんが書きました:NULL

'\0'
とは別物であることに留意してください。
一緒くたにしてました。覚えておきます。ご指摘ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る