[英]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.