0

This code crashes the program

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

whereas this doesn't

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

Why ? I am using MinGW with Code::Blocks IDE.

4

3 回答 3

4

你很幸运,一个崩溃而另一个没有。
这两个程序都会产生未定义的行为。

char *name2;
gets(name2);

您需要将指针指向一个有效且足够大的内存,以便能够对其进行写入。你只是在写一个未初始化的指针。这会导致未定义的行为。未定义的行为不要求崩溃,它的字面意思是任何行为都是可能的,因为在你的情况下,它有时可能会崩溃,也可能不会,但它仍然是一个不正确的程序。

理想的解决方案是简单地使用std::string.
如果您坚持使用char *,则需要将此指针指向有效内存。例如

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

您必须为输入提供内存,但您没有。如果你想坚持getsputs,你应该更改char *namechar name[100]分配内存:

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

如果您需要超过 100 个字符(包括字符串末尾的 \0 字符),则必须相应地增加大小。

在 C++ 中,使用std::string很可能是更好的选择。

于 2013-04-25T08:53:25.943 回答
1

两者都是未定义的行为,它是否会崩溃,是相当幸运的问题。

于 2013-04-25T08:41:44.287 回答