- #include <stdio.h>
- #include <conio.h>
- int* Pool(int array[],int size)
- {
- int *x;
- int i=0;
- int a[2]={0,1};
- for(i=0;i<size;i++)
- {
- a[0]+=array[i]; //存儲數組元素值的和
- a[1]*=array[i]; //存儲數組元素值的積
- }
- //將數組的基地址賦值給整型指針
- x=&a[0];
- //返回整個數組
- return x;
- }
- int main()
- {
- int a[]={1,2,3,4};
- 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 a[]={1,2,3,4};
- int *c; c = Pool(a,4);
- Pool(a,3); //增加這句
- printf("Sum = %d\nProduct = %d\n",c[0],c[1]);
- getch();
- return 0;
- }
得到的結果跟上面就不一樣了