C ++ cin,Segment fault 11

时间:2011-11-09 17:46:22

标签: c++ cin

当我输入字符串时,这给了我seg错误11。 为什么我会遇到段故障? 这很简单...... seg故障来自哪里?

int main(){
    char * str;
    printf ("please enter string : ");
    cin >> str;
    // reverse_str(str);   
}

7 个答案:

答案 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);