输入一个char *声明之前崩溃的程序,而这样做到'只是声明'char *不。为什么?
此代码导致程序崩溃输入一个char *声明之前崩溃的程序,而这样做到'只是声明'char *不。为什么?
#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;
}
为什么? 我使用MinGW和Code :: Blocks IDE。
你只是幸运的一个崩溃,其他没有。
这两个程序都会产生未定义的行为。
char *name2;
gets(name2);
你需要指向一个有效和足够大的内存指针才能写入它。你只是写一个未初始化的指针。这会导致未定义的行为。 未定义的行为不会强制崩溃,它的字面意思是任何行为都是可能的,因为在您的情况下,它可能会崩溃,可能不会但它不过是一个不正确的程序。
理想的解决方案是简单地使用std::string
。
如果您坚持使用char *
,则需要将此指针指向有效内存。对于例如
char myArr[256];
char *name2 = &myArr;
“和足够大的内存” - 你如何建议确保有足够的内存来存储'gets'读取的输入? :) – hvd 2013-04-25 08:53:12
@Alok一个好的和快速的答案。多谢兄弟! – 2013-04-25 08:53:36
两者都是未定义的行为,它是否会崩溃,是相当重要的运气。
你必须为你的输入提供的内存,但你不知道。如果你想坚持在得到和提出你应该改变char *name
到char name[100]
或分配内存:
char *name = new char[100];
...
delete name;
如果需要超过100个字符(包括在字符串末尾的\ 0字符)你必须相应地增加尺寸。
在C++中使用std::string
最有可能是更好的选择。
不要使用裸指针。使用'std :: string'。裸指针可怕地难以理解和正确使用。 – 2013-04-25 08:41:19
这两个版本都是错误的:没有空间保留/分配 – 2013-04-25 08:43:06