3

このプログラムで文字列が 9 文字を超えた場合、エラーが発生するはずがありませんか?

// CString.c
// 2.22.11

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

main()
{
    char *aString = calloc(10, sizeof(char));

    if (aString == NULL)
    {
        return 1;
    }

    printf("PLEASE ENTER A WORD: ");
    scanf("%s", aString);

    printf("YOU TYPED IN: %s\n", aString);
    //printf("STRING LENGTH: %i\n", strlen(aString));
}

ありがとう

ブラグマン

4

2 に答える 2

5

構文が正しいため、コンパイラ エラーは発生しません。間違っているのはロジックであり、バッファの終わりを過ぎてメモリに書き込んでいるため、未定義の動作が得られます。

なぜそれが未定義の動作なのですか? あなたはそのメモリを割り当てていません。つまり、それはあなたのものではありません。あなたは、注意テープで閉鎖されたエリアに侵入しています。プログラムがバッファの直後のメモリを使用しているかどうかを検討してください。バッファをオーバーランしたため、そのメモリを上書きしました。

次のようなサイズ指定子の使用を検討してください。

scanf("%9s", aString);

そのため、バッファをオーバーランしません。

于 2011-02-24T04:02:30.330 に答える
1

はい、エラーが発生しました。そして、最も残念な部分は、あなたがそれについて知らないということです。プログラムの後半で何かが不可解にクラッシュしたとき (運が良ければ)、またはクライアントの弁護士があなたを訴えに来たとき (そうでない場合) に、それについて知ることができます。

于 2011-02-24T04:15:53.513 に答える