为什么 cin 提取运算符会导致段错误


#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字符串。究竟是什么导致了这个问题?

程序出现段错误,因为指针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

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

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

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

这是因为您没有为字符串分配内存。

相关内容

  • 没有找到相关文章

最新更新