2012-05-19 76 views
2
const char* test(bool i) 
{ 
    const char t[] = "aa\n"; 
    const char* p = "bbb\n"; 
    if(i) 
     return p; 
    return t; 
} 
int main(array<System::String ^> ^args) 
{ 
    printf(test(true)); 
    printf(test(false)); 
    return 0; 
} 

返回類的東西:功能和返回爲const char *

bbb 
%^&$^$% 

顯然,測試(假)返回一個指向一個局部變量。問題是,p也是局部變量。爲什麼在函數返回後沒有清除「bbb \ n」的內存。我認爲const char []與const char *的解釋方式相同,但它看起來並不正確。

回答

1

p是一個局部變量,您可以通過值返回,而是指向了一個字符串字面,它駐留在只讀存儲器中,而不是在分配方法自動記憶。

返回t和使用它確實導致未定義的行爲。

另外,不要以爲指針和數組是等價的。

+0

該標準是否規定了字符串文字的存儲方式?也就是說,字符串(在共同的經驗中)在只讀存儲器中存在,直到整個程序結束才存在,這是一個標準的強制性行爲嗎?如果不是,它可能存在一個編譯器,將字符串文字放入函數堆棧中...爲什麼不是(如果標準沒有規定任何關於它的內容) – ShinTakezou

+1

@ShinTakezou:第3.7.1節「所有變量沒有動態存儲時間,沒有線程存儲時間,並且本地沒有靜態存儲時間,這些實體的存儲應持續到程序的持續時間。「 –

+0

@BenVoigt謝謝。即使是「確切」的字符串文字也不是變量,所以本節不適用於它們。但我認爲這是一個「細微差別」,該部分也提到了字符串文字(也)。 – ShinTakezou

5

儘管p是一個局部變量,它指向的不是本地的 - 它是一個編譯時字符串常量;從函數返回該常量的地址是合法的。

t是不同的,因爲編譯時字符串常量是複製成自動存儲區域,從而導致對解引用返回的指針的未定義的行爲。

+2

嚴格地說,它沒有返回導致未定義行爲的指針,而是稍後解除引用。 –

+0

@ BenVoigt你是對的,我編輯了答案來澄清這一點。 – dasblinkenlight

相關問題