關於區域性變數的指標,棧,和棧的釋放的幾個例子
阿新 • • 發佈:2019-01-23
看幾個例子
一個是經典的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);
這兩句調換一下順序,再執行會發現結果變成了:
printf("%u+%u",a,b);
再寫
printf("=%u\n",*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; }