我想從命令行分配字符串。但是我得到了分段錯誤。爲什麼?這裏是代碼:C++,char *,分段錯誤
char* ans;
cout << "enter string: ";
cin >> *ans;
更新: 如何事先分配內存,如果我不知道輸入字符串的大小, 它是如何工作的String類?
我想從命令行分配字符串。但是我得到了分段錯誤。爲什麼?這裏是代碼:C++,char *,分段錯誤
char* ans;
cout << "enter string: ";
cin >> *ans;
更新: 如何事先分配內存,如果我不知道輸入字符串的大小, 它是如何工作的String類?
你有一個指針,但是這個指針並不指向有空間分配給數據存儲的地方。使用std::string
代替:
std::string ans;
cout << "enter string: ";
cin >> ans;
// ...
ans.c_str(); // returns const char *
因爲您沒有爲ans
分配任何內存。
這導致未定義的行爲,其中用戶輸入的字符串被寫入某個不屬於您的變量ans
的內存,並導致崩潰。 更好的方法是使用std::string
而不是char *
。
std::string ans;
cout << "enter string: ";
cin >> ans;
您需要分配內存中讀取你的字符串轉換成 - 在你的代碼ans
未初始化,因此可能會指向任何隨機的內存位置。這可能會導致崩潰。有沒有理由不想使用string
?
char *ans;
定義一個指針,而無需對其進行初始化。一個指針只能指向某個存儲區域,但它不支持它。沒有初始化它,你無法解除引用。
你需要做兩件事情:
分配一定的存儲。爲此定義一個靜態變量,或者使用new
關鍵字使用動態存儲。
用此存儲器的地址初始化指針。
還是做更好的事情,根本不具有裸指針操作和使用std::string
將採取的內存分配的所有細節。
通過使用char*
,您試圖寫入您不屬於自己的內存,並且操作系統正在暫停您的應用程序,然後才能造成任何損害。
相反,你可以試試:
#include <string>
std::string ans;
cout << "enter string: ";
cin >> ans;
const char* ans_str = ans.c_str();
我只是玩玩。決定用char *來做。如果我不知道輸入文本的大小,我將如何分配內存。 – ashim 2011-12-26 18:30:35
@ michael - 你不知道。只需最好地分配「足夠」的空間或以某種方式確定輸入的大小。 – 2011-12-26 18:31:25