2012-06-13 34 views
1
#include<stdio.h> 
#include<stdlib.h> 
char* re() 
{ 
    char *p = "hello"; 
    return p;  
} 
int main() 
{ 
    char* tem = re(); 
    printf("%s", tem); 
    return 0; 
} 

我的編譯器是Dev-C++。 我認爲're'函數完成時,'p'的指針將被刪除,'p'指向的堆棧空間也會被刪除。所以'tem'的指針不能訪問'p'指向的堆棧空間。 在我看來,這段代碼會出現一些錯誤。但爲什麼不呢?c語言和一些指針的疑惑

這個問題歪曲了我很長一段時間。如果你能告訴我理由,我會感激你的善良的心。

+2

指針p將超出範圍。但是它的*值*(它指向的)將被返回給調用者(main)。它(值)指向一個字符串,它在re()返回後仍然存在。 – wildplasser

回答

5

p不指向堆棧空間。它指向字符串文字"hello"。由於字符串文字在整個程序中保證有效,所以你的程序是可以的。

(我不知道開發-C++,但在大多數編譯器,字符串是在程序的加載一些只讀內存中分配,並停留在那裏,直到它的結束)

編輯:請注意,即使字符串在堆棧中,並且代碼實際上是錯誤的,語言中的任何內容都不能保證不起作用。無效內存可以(但不必)仍然包含它在無效之前包含的值。

+0

只是供參考:Dev-C++只是一個使用MinGW的IDE,因此引擎蓋下只是gcc。 –

0

字符串「hello」不是堆棧分配(但char *p指針是)。
它在'數據段'中,因爲它是一個常量值(只讀存儲器)。
From C FAQ:http://c-faq.com/decl/strlitinit.html