当我输入字符串时,这给了我seg错误11。 为什么我会遇到段故障? 这很简单...... seg故障来自哪里?
int main(){
char * str;
printf ("please enter string : ");
cin >> str;
// reverse_str(str);
}
答案 0 :(得分:5)
您尚未为str
分配任何内存。所以你试图基本上写一个不能保存字符串的指针。从本质上讲,这会导致未定义的行为和seg错误。
解决方案是:
您应该使用 std::string 而不是指针。
std::string str;
std::cout<<"please enter string : ";
std::cin >>str;
另外,尽量不要混用C和C ++
在C ++中使用streams
而不是printf
或者,还有另外两种方法:
不太好其他方法1:
您可以通过将内存设置为固定大小的数组来为str
分配内存:
#define MAX_INPUT 256
char str[MAX_INPUT]={0};
<强>缺点:强>
这需要您知道用户在编译时可以输入的最大输入的长度,因为在C ++中不允许 Variable Length Arrays 。
不太好其他方法2:
您可以使用str
动态地将内存分配给new []
。str
在这种情况下将是指针。
#define MAX_INPUT 256
char *str = new char[MAX_INPUT];
<强>缺点:强>
同样,这种方法的缺点是在这种情况下知道在编译时要分配多少内存,因为用户输入了字符串。此外,您需要记住通过调用delete[]
或泄漏内存来解除分配。
另外,尽量避免在C ++中尽可能多地使用new
。
<强>结论:强>
这里的最佳解决方案是使用std::string
,因为它可以避免上述所有问题。
答案 1 :(得分:3)
str
并没有指出任何明智的事情。你需要有一个内存来写信。
std::string str;
std::cout << "please enter string: ";
std::cin >> str;
答案 2 :(得分:2)
您应该使用std::string
代替。
您的声明:
char * str;
仅声明指针,但不为要存储的字符串分配内存区域。解决方案可能是
char str[256];
或
char * str = new char[256];
但是,它们非常样式不好,因为每次要写入时都需要检查和控制输入的大小。
C ++提供std::string
来存储字符串。使用它。
答案 3 :(得分:1)
你的第一行char * str
声明了一个原始指针,并没有初始化它或分配任何内存。这意味着它可以指向任何地方,并且很可能不是某个有效或有用的地方。当您尝试在第3行使用它时,您很可能是段错误。您可以使用std::string
吗?它比原始的C字符串更容易,更安全。
答案 4 :(得分:0)
使用std::string
。
或者,如果您只想使用char *(气馁):
char * str = new char[256];
cin >> str;
答案 5 :(得分:0)
您需要先为str
分配内存。你只声明了一个指针
char* str = (char*)malloc(MAX_SIZE_OF_BUFFER);
答案 6 :(得分:0)
当程序访问不属于它的内存时,会发生分段错误。指针str
未初始化。它没有指向任何记忆。流提取运算符>>
不为它读取的字符串分配新内存;它期望指针已经指向它可以填充的缓冲区。但它不知道str
是垃圾。它假定它是一个有效的指针并尝试写入该内存。由于该垃圾地址的内存不属于您的程序,因此操作系统会因分段错误而停止该操作。
请改为阅读std::string
。更好的是,使用std::getline
,以便用户可以输入带空格的字符串; >>
运算符只会读取第一个空白字符。
std::string str;
std::getline(cin, str);