为什么cin提取操作符导致段错误?

时间:2012-08-19 04:19:14

标签: c++ segmentation-fault

#include <iostream>

using namespace std;

int main() {
    char * c;
    cin >> c;
    return 0;
}

我正在尝试从长度未知的用户处获取C字符串行。我知道如果我将c声明为char c[80]而不是char * c,那么它就不会导致段错误。

但是,如果我不想将用户限制为80 - 1个字符,该怎么办?我可以使用一个非常大的数字但这只会浪费空间。

我还想知道为什么上面的程序会导致段错误。据我所知,cin提取运算符(>>)知道NULL终止一个C字符串。究竟是什么导致了这个问题?

3 个答案:

答案 0 :(得分:7)

程序段错误,因为指针c未初始化。在将数据读入缓冲区之前,您需要为缓冲区分配内存:

char * c = new char[80];
cin >> c;
cout << c << endl;
delete[] c; // Now you need to delete the memory that you have allocated.

要避免将输入限制为N个字符,请使用字符串。它们会根据您的需要动态调整大小:

string c;
cin >> c;
cout << c;
// You do not need to manage string's memory - it is done automatically

答案 1 :(得分:2)

当您仅使用char *c;时,您没有为字符串分配任何空格。变量声明创建一个指向char的指针,该指针未初始化。然后使用cin将字符串读入该空间。 c可以指向任何,并且无论如何都会指向不属于您的记忆。

在尝试从cin填充字符串之前,您需要为字符串分配空间。

如果您不想对字符串长度设置限制,则可以循环并realloc更多空间,直到完全读取输入,但如上所述,如果使用{{1而不是C字符串,那么这将为您处理。

答案 2 :(得分:0)

那是因为你没有为你的字符串分配内存。