1

キーボードから文字列を読み取り、に格納したいbuf。配列を設定しましたchar buf[6]。この配列は最大で 5 文字と\0.

次に123 456 789、11 文字と を入力する\0と、プログラムは実行できますが、より長い文字列を入力する123 456 789 123 456 789と、実行時にクラッシュします。これら 2 つの入力も の範囲外ですがbuf、一方は実行できますが、もう一方はクラッシュしますか?

これが私のコードです:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void read_str();

int main(){
    read_str();
    system("pause");
    return 0;
}
void read_str(){

    char buf[6] = {};
    scanf("%[^\n]",buf);
    printf("%d\n",strlen(buf));
    printf("%s\n",buf);
}
4

2 に答える 2

3

これは、割り当てられたメモリの境界外に書き込むための未定義の動作です。現在は機能しているかもしれませんが、機能することに依存することはできません。Annex Undefined behaviorC99 ドラフト標準には、次のように記載されています。J.2

オブジェクトが与えられた添え字で明らかにアクセス可能であっても (int a[4][5] 宣言が与えられた左辺値式 a[1][7] のように)、配列添え字は範囲外です (6.5.6)。

段落2の用語を定義するセクションの3.4.3 未定義の動作に注意してください(強調鉱山):

未定義の可能性のある動作は、状況を完全に無視して予測不能な結果を​​もたらすことから、翻訳中またはプログラム実行中に、環境に特有の文書化された方法で動作すること (診断メッセージの発行の有無にかかわらず)、翻訳または実行の終了 (診断メッセージの発行を伴う) にまで及びます。診断メッセージの)。

于 2013-09-28T02:40:55.347 に答える