函式返回型別為指標型別時的一些問題

2021-09-30 15:15:15 字數 1829 閱讀 5778

原文出處:

1.先看程式:

#includechar *returnstr()

int main()

來分析下該程式。

(1)char *p = 「tigerjibo」。系統在棧上分配四個位元組的空間存放p的數值。「tigerjibo」是字元常量,存放在唯讀資料段內。指向完後,系統把」tigerjibo」的位址賦值給p。

(2)函式用return 把p的數值返回。該數值指向唯讀資料段(該資料段內的資料是靜態的不會改變)。退出子函式後,系統把p的數值銷毀。但是p的數值已經通過return 返回。且唯讀資料段中的內容不會被修改和**(其輸於靜態區域)

(3)在主程式中把該位址又給了str。因此str指向了「tigerjbo」。

(4)該程式雖然能執行,擔又乙個缺點,就是在程式中不能修改字元常常量中的數值。如果修改會引起段錯誤。

2.先看程式

#includechar *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.先看乙個程式:

#includechar *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#includevoid 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.先看程式 include char returnstr int main 來分析下該程式。1 char p tigerjibo 系統在棧上分配四個位元組的空間存放p的數值。tigerjibo 是字元常量,存放在唯讀資料段內。指向完後,系統把 tigerjibo 的位址賦值給p。2 函式用retu...