C語言函數不能返回局部變量的地址

在C中,正常情況下,我們只能從函數中返回一個值。但在很多情況下,我們需要從函數中返回多個值,此時使用數組或指針能夠很好地完成這樣的任務。這裏是一個示例。這個程序使用一個整型數組作爲參數,並將數組元素的和與積返回給調用函數。下面是C代碼,這是一種常見情況。下面給出實現技巧:
  1. #include <stdio.h> 
  2. #include <conio.h> 
  3. int* Pool(int array[],int size)  
  4. {  
  5.    int *x;  
  6.    int i=0;  
  7.    int a[2]={0,1};  
  8.    for(i=0;i<size;i++)  
  9.    {  
  10.       a[0]+=array[i];                       //存儲數組元素值的和  
  11.       a[1]*=array[i];                       //存儲數組元素值的積  
  12.    }  
  13.    //將數組的基地址賦值給整型指針  
  14.    x=&a[0];  
  15.    //返回整個數組  
  16.    return x;  
  17. }  
  18.  
  19. int main()  
  20. {  
  21.    int a[]={1,2,3,4};  
  22.    int *c; c = Pool(a,4);  
  23.    printf("Sum = %d\nProduct = %d\n",c[0],c[1]);  
  24.    getch();  
  25.    return 0;  

這樣,你已經學會了如何使用數組和指針從C函數中返回多個值。在很多情況下你會發現這個技巧很有用。

其實上面的用法是有問題的,在C語言中絕不能返回函數內局部變量的地址。

在c語言中,一種典型的錯誤就是將一個指向局部變量的指針作爲函數的返回值。由於該數組是局部變量,因此在函數返回時其數組空間已經作廢了,即指針應用一塊無意義的地址空間,所以不會有返回值。

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

退出函數的時候,系統只是修改了棧頂的指針,並沒有清內存;
所以,是有可能正常訪問到局部變量的內存的。
但因爲棧是系統自動管理的,所以該內存可能會被分配給其他函數,這樣,該內存的內容就會被覆蓋;不再是原來的值了。

  1. int main()  
  2. {  
  3.    int a[]={1,2,3,4};  
  4.    int *c; c = Pool(a,4);  
  5.   Pool(a,3);  //增加這句
  6.    printf("Sum = %d\nProduct = %d\n",c[0],c[1]);  
  7.    getch();  
  8.    return 0;  

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




發佈了15 篇原創文章 · 獲贊 61 · 訪問量 56萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章