繁体   English   中英

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

[英]Why does the cin extraction operator cause a segfault?

#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 *c; 变量声明创建一个指向未初始化的char的指针。 然后使用cin将字符串读入该空间。 c可以指向任何东西 ,并且无论如何都会指向不属于你的记忆。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM