#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 字符串,那么这将为您处理。
这是因为您没有为字符串分配内存。