0

このコードはプログラムをクラッシュさせます

#include <cstdio>
int main()
{
    char *name1;
    char *name2 = "Mark";
    gets(name1);
    puts(name1);
    return 0;
}

これはそうではありません

#include <cstdio>
int main()
{
    char *name1 = "Mark";
    char *name2;
    gets(name2);
    puts(name2);
    return 0;
}

なんで ?Code::Blocks IDE で MinGW を使用しています。

4

3 に答える 3

4

一方がクラッシュし、もう一方がクラッシュしないのは幸運です。
どちらのプログラムも、未定義の動作を生成します。

char *name2;
gets(name2);

ポインターを、書き込み可能な有効で十分な大きさのメモリーにポイントする必要があります。初期化されていないポインタに書き込んでいるだけです。これにより、未定義の動作が発生します。未定義の動作はクラッシュを強制するものではありません。文字通り、任意の動作が可能であることを意味します。あなたの場合、クラッシュすることもあればクラッシュしないこともありますが、それでも正しくないプログラムです。

理想的な解決策は、単に使用することstd::stringです。
どうしても使用しchar *たい場合は、このポインタを有効なメモリに向ける必要があります。例えば

char myArr[256];
char *name2 = &myArr;
于 2013-04-25T08:41:48.537 に答える
1

入力用のメモリを提供する必要がありますが、そうではありません。getとput固執したい場合は、メモリを変更するか割り当てる必要があります。char *namechar name[100]

char *name = new char[100];
...
delete name;

100 文字以上 (文字列の最後の \0 文字を含む) が必要な場合は、それに応じてサイズを増やす必要があります。

C++ では、 usingstd::stringがおそらくより良い代替手段です。

于 2013-04-25T08:53:25.943 に答える
1

どちらも未定義の動作であり、クラッシュするかどうかは運次第です。

于 2013-04-25T08:41:44.287 に答える