输入一个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。

+3

不要使用裸指针。使用'std :: string'。裸指针可怕地难以理解和正确使用。 – 2013-04-25 08:41:19

+0

这两个版本都是错误的:没有空间保留/分配 – 2013-04-25 08:43:06

你只是幸运的一个崩溃,其他没有。
这两个程序都会产生未定义的行为。

char *name2; 
gets(name2); 

你需要指向一个有效和足够大的内存指针才能写入它。你只是写一个未初始化的指针。这会导致未定义的行为。 未定义的行为不会强制崩溃,它的字面意思是任何行为都是可能的,因为在您的情况下,它可能会崩溃,可能不会但它不过是一个不正确的程序。

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

char myArr[256]; 
char *name2 = &myArr; 
+0

“和足够大的内存” - 你如何建议确保有足够的内存来存储'gets'读取的输入? :) – hvd 2013-04-25 08:53:12

+0

@Alok一个好的和快速的答案。多谢兄弟! – 2013-04-25 08:53:36

两者都是未定义的行为,它是否会崩溃,是相当重要的运气。

你必须为你的输入提供的内存,但你不知道。如果你想坚持在得到提出你应该改变char *namechar name[100]或分配内存:

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

如果需要超过100个字符(包括在字符串末尾的\ 0字符)你必须相应地增加尺寸。

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