2013-03-28 88 views
0

誰能解釋一下下面的代碼是如何工作的,並不會應用程序崩潰?C++字符串流爲char *轉換內存分配

int main() { 
    char *tempStr = new char[5]; 
    tempStr[0] = '\0'; 
    string stemp = "helloworld"; 
    stringstream sstream; 
    sstream.str(stemp); 
    cout << "len before = " << strlen(tempStr); 
    sstream >> tempStr; 
    cout << "len after = " << strlen(tempStr) << endl; 
    cout << tempStr << endl; 
    delete[] tempStr; 
    return 1; 
} 

我得到的輸出作爲

len before = 0 
len after = 10 
helloworld 
  1. 沒有stringstream在字符指針多餘的字符分配內存?
  2. 也想知道正確的方式從stringstream複製數據到char *數組,不超過分配給char*內存?

回答

3

Stringstream是否爲char指針中的額外字符分配內存?

號你的代碼調用未定義的行爲。

也想知道正確的方法來從stringstream複製數據到char *數組,而不會超過分配給char *的內存?

這是不是一個好主意,讀入char*。使用std::string從流中讀取輸入。但如果你仍然想知道知識的緣故,請使用std::istream::read()

if (sstream.read(tempStr, 5)) 
{ 
    //read succeeded 
} 

順便說一句,你可以合併這兩條線:

stringstream sstream; 
sstream.str(stemp); 

成一個:

stringstream sstream(stemp); 

或簡單:

stringstream sstream("helloworld"); //no need of stemp! 

希望有所幫助。

+0

我們還可以做's stemp'嗎? – 0x499602D2

+0

是的,因爲它是用於輸入和輸出的'stringstream'。 – Nawaz

+0

我有一個要求,不能使用字符串。所以唯一的方法是使用'istream :: read'並指定char數組的最大長度。謝謝。 – N3Xg3N

1
  1. 號您已改寫存儲,調用未定義的行爲,但沒有明顯的發生了,所以錯誤置若罔聞。有沒有這樣做這樣的事情應該引起任何人可見的錯誤或專項行動,因此措辭不確定的行爲要求。
  2. 你就必須把塊做塊,如果它運行的空間重新分配char陣列。在C++中,手動執行此操作幾乎沒有意義。只需使用std::string即可完成。
+0

確定,所以沒有新的內存分配。謝謝。 – N3Xg3N