2012-03-27 30 views
2

今天我遇到了下面的代碼塊:當返回一個本地字符數組爲什麼strcpy工作,但字符串構造函數失敗?

#include <iostream> 
using namespace std; 
char *return_char_array(const char *cptr) 
{ 
    char charArray[100] = {0}; 
    strcpy(charArray, cptr); 
    return charArray; 
} 
int main() 
{ 
    const char *cptr = "test"; 

    char localCharArray[100] = {0}; 
    strcpy(localCharArray, return_char_array(cptr)); // output "test" 
    cout<<localCharArray<<endl; 

    string s = return_char_array(cptr);    // corrupt output 
    cout<<s<<endl; 

    return 0; 
} 

當時我還以爲這兩個輸出將被破壞的一見鍾情,但令人驚訝的是第一輸出爲「測試」,而第二個是腐敗。有人會告訴我爲什麼嗎?

+0

未定義的行爲是未定義的...編輯:實際上,這甚至不會爲我編譯,因爲您給出了'return_char_array()''const char *',並且不能隱式拋棄'const'ness 。但是,我猜這是因爲調用'strcpy()'沒有在堆棧上放置足夠的內存來覆蓋特定的內存區域,而創建一個'string'的確如此。 – BoBTFish 2012-03-27 11:28:45

+0

@BoBTFish對不起,我在參數列表中丟失了'const' .. – OriginalWood 2012-03-27 11:34:22

+0

Cure:'std :: string'和其他標準庫容器。 – 2012-03-27 11:35:02

回答

6

他們都腐敗。只是因爲它似乎有效,並不意味着它是好的。

這是未定義的行爲,任何事情都可能發生,包括出現工作。

相關問題