函數的局部變量和不可重入性

如下的一個程序:

#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雖然解決了上訴問題,把地址轉到了全局區,但是把函數變的不可重入了,應該儘量避免,除非需求所致。

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