1.先看程式:
#include
char *returnstr()
int main()
來分析下該程式。
(1)char *p = 「tigerjibo」。系統在棧上分配四個位元組的空間存放p的數值。「tigerjibo」是字元常量,存放在唯讀資料段內。指向完後,系統把」tigerjibo」的位址賦值給p。
(2)函式用return 把p的數值返回。該數值指向唯讀資料段(該資料段內的資料是靜態的不會改變)。退出子函式後,系統把p的數值銷毀。但是p的數值已經通過return 返回。且唯讀資料段中的內容不會被修改和**(其輸於靜態區域)
(3)在主程式中把該位址又給了str。因此str指向了「tigerjbo」。
(4)該程式雖然能執行,擔又乙個缺點,就是在程式中不能修改字元常常量中的數值。如果修改會引起段錯誤。
2.先看程式
#include
char *returnstr()
int main()
編譯該程式後,系統會提示如下警告:
function returns address of local variable
(函式返回乙個可變位址)
分析該錯誤:
1>」tigerjibo」是乙個字元常量,存放在唯讀資料段中,是不能被修改的。
2>char p,是乙個區域性變數,當函式被呼叫時,在棧上開闢乙個空間來存放陣列p的內容。
3>char p=」tigerjibo」,該語句是把」tigerjibo」的值賦值給數值p,存放在陣列p位址處。而不是把」tigerjibo」的位址賦值給陣列p。因此,「tigerjibo」此時在系統中有一處備份,乙個在唯讀資料段中(不能修改,內容也不會被**),乙個在棧上儲存(可以修改起內容,但函式退出後,其棧上儲存的內容也會被**)。
4>因此,當return p,返回了陣列的首位址,但是當函式退出後,其棧上的內容也將被丟棄,區域性變數的記憶體也被清空了,因此該陣列首位址處的內容是乙個可變的值。
3.先看乙個程式:
#include
char *returnstr()
int main()
此程式執行正確。
分析如下:
1>」tigerjibo」是乙個字元常量,存放在唯讀資料段中,是不能被修改的。
2>static char p,是乙個靜態區域性變數,在讀寫資料段中開闢乙個空間給p用來存放其數值。
3>static char p=」tigerjibo」,該語句是把」tigerjibo」的值賦值給數值p,存放在陣列p位址處。而不是把」tigerjibo」的位址賦值給陣列p。因此,「tigerjibo」此時在系統中有一處備份,乙個在唯讀資料段中(不能修改,內容也不會被**),乙個在讀寫資料段中儲存(可以修改其內容,當函式退出後,因其在讀寫資料段中儲存,起內容不會被丟棄)。
4>因此,當return p,返回了陣列的首位址,但是當函式退出後,雖然棧上的內容都清除了,但是p位址是讀寫資料段中的位址,其上的內容不會被**。
4.先看乙個程式:
#include
#include
#include
void getmemory(char *p)
int main()
編譯後錯誤:
段錯誤分析:在主程式中,str位址為空。在函式傳遞中將str的位址傳給了子函式中的指標p(是拷貝了乙份),然後在字函式中給p在堆上申請了乙個100位元組的空間,並把首位址賦值給p。但是函式傳遞中,p值改變不會影響到主函式中str的值。因此,str的位址仍為空。在strcpy中引用空指標會出現段錯誤。
**
函式返回型別為指標型別時的一些問題
1.先看程式 include char returnstr int main 來分析下該程式。1 char p tigerjibo 系統在棧上分配四個位元組的空間存放p的數值。tigerjibo 是字元常量,存放在唯讀資料段內。指向完後,系統把 tigerjibo 的位址賦值給p。2 函式用retu...
函式返回型別為指標型別時的一些問題
1.先看程式 include char returnstr int main 來分析下該程式。1 char p tigerjibo 系統在棧上分配四個位元組的空間存放p的數值。tigerjibo 是字元常量,存放在唯讀資料段內。指向完後,系統把 tigerjibo 的位址賦值給p。2 函式用retu...
函式返回型別為指標型別時的一些問題
原文出處 1.先看程式 includechar returnstr int main 來分析下該程式。1 char p tigerjibo 系統在棧上分配四個位元組的空間存放p的數值。tigerjibo 是字元常量,存放在唯讀資料段內。指向完後,系統把 tigerjibo 的位址賦值給p。2 函式用...