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