1

次のプログラムを検討してください。

#include <stdio.h>
int main(void)
{
    char side_a[] = "Side A";
    char dont[] = {'W', 'O', 'W', '!' }; 
    char side_b[] = "Side B";
    puts(dont); /* dont is not a string */
    return 0;
}

null 文字に遭遇すると puts() 関数が停止することを知っています。しかし、上記のプログラムでは null 文字を指定していません。それで、いつ印刷を停止しますか?このプログラムは未定義の動作を呼び出しますか? さまざまな C コンパイラでこのプログラムの同じ出力が得られることが保証されていますか? C標準はこれについて何と言っていますか?

4

3 に答える 3

4

putsの最後の要素を超えて読み取ることになりますがdont、これは未定義の動作です。

いいえ、毎回同じ出力が保証されるわけではありません。その点については、出力がまったく保証されていません-これは未定義の動作であるため、何も保証されていません。

于 2015-06-06T09:46:15.433 に答える
3

はい、このエラーにより、プログラムの動作が定義されていません。この用語が示すように、そのようなプログラムの実行から妥当な結果が得られるとは期待できません。

于 2015-06-06T09:46:24.143 に答える
2

ええ、それはUndefined Behaviorになるため、出力は常に同じではありません。そのような場合に印刷したい場合は、以下のように出力を統一することをお勧めします。

printf("%.*s", 4, dont);
于 2015-06-06T09:51:40.813 に答える