如下的一個程序:
#include "stdio.h"
int* init(int n)
{
int i;
static int sum = 0;
int sum1 = 0;
for(i=1;i<=n;i++)
{
sum += i;
sum1 += i;
}
printf("sum = %d/n",sum);
printf("sum1 = %d &sum1 = %d/n",sum1,&sum1);
return &sum1;//改成return &sum:就是在靜態區的地址,不同於棧,因此數據不會被後續的不相干的函數調用覆 蓋掉
}
int main()
{
int *sum,*sum1;
sum = init(1);
printf("%d %d/n",sum,*sum);
sum1 = init(2);
if(sum1==sum)printf("true/n");//printf函數改動了sum1地址的值,如果沒有這句,下一語句執行結果正確
printf("%d %d/n",sum1,*sum1);
printf("%d %d/n",sum,*sum);//sum地址的值已經被上一個語句中的printf函數的變量改變了
getchar();
return 0;
}
出現以上原因是因爲sum,sum1的地址是在棧的地址中,而函數返回後雖然值仍在那個地址中,但空間已經釋放掉了,因此下一次設計到入棧的操作,就會把那個地址的值給覆蓋掉,導致結果出錯,這是很不好的習慣。而用static雖然解決了上訴問題,把地址轉到了全局區,但是把函數變的不可重入了,應該儘量避免,除非需求所致。