C語言函式不能返回區域性變數的位址

2021-07-09 02:31:44 字數 1588 閱讀 9900

在c中,正常情況下,我們只能從函式中返回乙個值。但在很多情況下,我們需要從函式中返回多個值,此時使用陣列或指標能夠很好地完成這樣的任務。這裡是乙個示例。這個程式使用乙個整型陣列作為引數,並將陣列元素的和與積返回給呼叫函式。下面是c**,這是一種常見情況。下面給出實現技巧:

#include<

stdio.h

>

#include<

conio.h

>

int* pool(int array,int size)  

;  for(i

=0;i<

size

;i++)  

//將陣列的基位址賦值給整型指標  

x=&a[0];  

//返回整個陣列  

return x;  

}  int main()  

;  int *c; c

= pool

(a,4);  

printf("sum

= %d\nproduct

= %d\n",c[0],c[1]);  

getch();  

return 0;  

}

這樣,你已經學會了如何使用陣列和指標從c函式中返回多個值。在很多情況下你會發現這個技巧很有用。

其實上面的用法是有問題的,在c語言中絕不能返回函式內區域性變數的位址。

在c語言中,一種典型的錯誤就是將乙個指向區域性變數的指標作為函式的返回值。由於該陣列是區域性變數,因此在函式返回時其陣列空間已經作廢了,即指標應用一塊無意義的位址空間,所以不會有返回值。

如果得到正常的值,只能是幸運的

退出函式的時候,系統只是修改了棧頂的指標,並沒有清記憶體;

所以,是有可能正常訪問到區域性變數的記憶體的。

但因為棧是系統自動管理的,所以該記憶體可能會被分配給其他函式,這樣,該記憶體的內容就會被覆蓋;不再是原來的值了。

int main()  

;  int *c; c

= pool

(a,4);  

pool(a,3);  //增加這句

printf("sum

= %d\nproduct

= %d\n",c[0],c[1]);  

getch();  

return 0;  } 

得到的結果跟上面就不一樣了

區域性變數是不能從外部訪問的,因為區域性變數只有在被呼叫時才會存在於記憶體中(具體地說是在執行時棧中),當函式被呼叫時,執行時棧在頂端為被呼叫函式分配乙個臨時棧幀,呼叫函式中宣告的所有變數都在臨時棧幀中分配相應的記憶體,當函式返回時,執行時棧彈出頂端棧幀(也就是被呼叫的那個函式的),因此所有區域性變數作廢,而後程式繼續執行,執行時棧不斷變化,而函式返回指標指向的記憶體單元就會不斷變化,顯示亂碼很正常。

而當在函式中用static宣告變數時,編譯器用另一種機制對待此變數(靜態變數),編譯器在生成的目標檔案中給靜態變數分配符號表,並附有附屬資訊(控制訪問),並且會分配相應的記憶體單元,也就是說固定的位址,存在於記憶體映像中的.data段,而不是在函式呼叫時再在臨時棧幀中分配記憶體,因此可以全域性引用,當然必須有正確的訪問許可權。

C語言函式不能返回區域性變數的位址

在c中,正常情況下,我們只能從函式中返回乙個值。但在很多情況下,我們需要從函式中返回多個值,此時使用陣列或指標能夠很好地完成這樣的任務。這裡是乙個示例。這個程式使用乙個整型陣列作為引數,並將陣列元素的和與積返回給呼叫函式。下面是c 這是一種常見情況。下面給出實現技巧 include stdio.h ...

C語言 返回區域性變數

一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被...

C 函式返回區域性變數

原因 返回值是拷貝值,區域性變數的作用域為函式內部,函式執行結束,棧上的區域性變數會銷毀,記憶體釋放。可返回的區域性變數 1.返回區域性變數本身 int sum int a,int b 2.常量 char returnvalue warning deprecatedconversion from s...