ここから本文です

C言語のsprintfについて #include <stdio.h> main() { char buff[256], a[]...

lad********さん

2010/5/1116:45:27

C言語のsprintfについて

#include <stdio.h>

main() {
char buff[256], a[]="Computer";
int i=10;
sprintf(buff, "%s%d", a, i);
printf("%s\n", buff);
return 0;
}

#include <stdio.h>

main() {
char buff[0], a[]="Computer";
int i=10;
sprintf(buff, "%s%d", a, i);
printf("%s\n", buff);
return 0;
}

としてもエラーもなく動作するのはなぜですか?
"Computer10"はbuffに'C', 'o', 'm', ・・・と入る気がするのにbuffの配列の
大きさは
関係ないのでしょうか??

閲覧数:
747
回答数:
2

違反報告

ベストアンサーに選ばれた回答

RainySeasonさん

編集あり2010/5/1211:10:43

>としてもエラーもなく動作するのはなぜですか?
単なる偶然です。

>"Computer10"はbuffに'C', 'o', 'm', ・・・と入る気がするのに
>buffの配列の大きさは関係ないのでしょうか??
関係あります。C言語では配列の大きさは自分で管理する必要があります。

「sprintf(buff, "%s%d", a, i);」の記述は、
あくまでも「buffで宣言されたアドレスから使用する」ということを設定しているだけです。
buff[]のサイズがいくつあるかは気にしません。
従って「何に使用しているかわからない」メモリ領域を破壊しながらデータを入れています。
「偶然に」使用していないか、このプログラムには影響のない領域であるため問題なく動いているように見えるだけです。

ベストアンサー以外の回答

1〜1件/1件中

邪威庵さん

2010/5/1117:00:36

Visual C++だと、
サイズが 0 の配列を割り当てまたは宣言しようとしました。
'buff' : サイズが不明です。
ってエラーになる。
なお、コンパイルエラーにならないように、buff[1]としてみると、
表示はされるが、
Run-Time Check Failure #2 - Stack around the variable 'buff' was corrupted.
となる。
buff[50]とかにすれば、当然正常に動く。

unix上のgccだと、表示はされるが、セグメントエラーになる。


というわけで、エラーもなく動作したと思うのは、気のせい、もしくは奇跡だと思う。
それなりのサイズのbuffにすべきである。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる