簡體   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