1. 程式人生 > >關於區域性變數的指標,棧,和棧的釋放的幾個例子

關於區域性變數的指標,棧,和棧的釋放的幾個例子

看幾個例子

一個是經典的1+2=65534:

程式碼如下

#include <stdio.h>
#include <stdlib.h>

unsigned short *Sum( unsigned char a,unsigned char b) 
{ 
unsigned short S=0; 

S=a+b; 
return &S; 
} 
int main() 
{ 
unsigned short *p=NULL; 
unsigned char a=1,b=2; 
p=Sum(a,b); 
printf("%u+%u",a,b); 
printf("=%u\n",*p); 
printf("=%u\n",p); 
system("pause");
return 0; 
}

這個&s,實際上返回了個指向區域性變數的指標,而這個變數在棧上,在函式Sum呼叫完的時候,就被釋放掉了,於是這個指標是指不到想要的值3的,

p=Sum(a,b);
上面這個語句使p得到一個地址,這個地址指向一個曾經的區域性變數,這個區域性變數在函式Sum()返回後就被作業系統清理掉了。

這個程式的執行結果如下:


現在我們嘗試將上面程式的

printf("%u+%u",a,b); 
printf("=%u\n",*p); 

這兩句調換一下順序,再執行會發現結果變成了:


我們可以發現,這一次的第一個結果是正確的,也就是1+2=3,因為這一次的printf輸出還沒有把原來棧裡面的資料覆蓋掉,而上一個程式裡面先寫的
printf("%u+%u",a,b);
再寫
printf("=%u\n",*p);
這樣第一句就把原來棧裡面的結果"3"給覆蓋掉了,所以得不出,於是我們做如下修改,把這兩句用printf("%u+%u=%u\n",a,b,*p);來代替,看看結果:

發現第一行的結果是對的,這時候我們如果將
printf("%u+%u=%u\n",a,b,*p);
printf("%u+%u=%u\n",a,b,*p);
這樣連寫兩行的話,會發現:
原理跟上面的一樣
下面我們這樣一段程式:
#include<stdio.h>
#include<stdlib.h>
char* check(void)
{
    char *p = "abc\n";
    return p;
}
 
int main()
{
    char *temp = check();
    printf("%s\n",temp);
    printf("%c\n",*temp);
system("pause");
    return 0;
}


對於這裡的
char*p = "abc\n";
這一句不是在棧裡面的,所以不會被覆蓋,可以返回值,結果如下: