2011-12-26 128 views
0

我想從命令行分配字符串。但是我得到了分段錯誤。爲什麼?這裏是代碼:C++,char *,分段錯誤

char* ans; 
cout << "enter string: "; 
cin >> *ans; 

更新: 如何事先分配內存,如果我不知道輸入字符串的大小, 它是如何工作的String類?

回答

3

你有一個指針,但是這個指針並不指向有空間分配給數據存儲的地方。使用std::string代替:

std::string ans; 
cout << "enter string: "; 
cin >> ans; 

// ... 

ans.c_str(); // returns const char * 
1

因爲您沒有爲ans分配任何內存。
這導致未定義的行爲,其中用戶輸入的字符串被寫入某個不屬於您的變量ans的內存,並導致崩潰。 更好的方法是使用std::string而不是char *

std::string ans; 
cout << "enter string: "; 
cin >> ans; 
0

您需要分配內存中讀取你的字符串轉換成 - 在你的代碼ans未初始化,因此可能會指向任何隨機的內存位置。這可能會導致崩潰。有沒有理由不想使用string

+0

我只是玩玩。決定用char *來做。如果我不知道輸入文本的大小,我將如何分配內存。 – ashim 2011-12-26 18:30:35

+0

@ michael - 你不知道。只需最好地分配「足夠」的空間或以某種方式確定輸入的大小。 – 2011-12-26 18:31:25

0
char *ans; 

定義一個指針,而無需對其進行初始化。一個指針只能指向某個存儲區域,但它不支持它。沒有初始化它,你無法解除引用。

你需要做兩件事情:

  • 分配一定的存儲。爲此定義一個靜態變量,或者使用new關鍵字使用動態存儲。

  • 用此存儲器的地址初始化指針。

還是做更好的事情,根本不具有裸指針操作和使用std::string將採取的內存分配的所有細節。

0

通過使用char*,您試圖寫入您不屬於自己的內存,並且操作系統正在暫停您的應用程序,然後才能造成任何損害。

相反,你可以試試:

#include <string> 

std::string ans; 
cout << "enter string: "; 
cin >> ans; 

const char* ans_str = ans.c_str();