函式內定義非靜態區域性變數當函式執行結束後自動釋放
阿新 • • 發佈:2019-01-09
#include <stdio.h>
int main(void)
{
void fun(char **p);
char arr[3] = {lis};
char *p1 = arr;
fun(&p1);
printf("%s\n",p1);
}
void fun(char **p)
{
char str[3] = "wei";
*p = str;
return ;
}
程式執行結束後,列印的結果是什麼? wei嗎,不是 為什麼呢?
當fun()函式執行結束後,p1將指向變數str,但此時區域性變數str記憶體已經釋放,所以得到的結果是隨機的。
解決辦法:
把區域性變數str定義成靜態變數 static char str[3] = “wei”;
靜態變數存放在全域性/靜態儲存區,不會因為函式執行結束而消失。
#include <stdio.h>
int main(void)
{
void fun(char **p);
int *p1 = NULL;
fun(&p1);
printf("%d\n",*p1);
return 0;
}
void fun(char **p)
{
int i = 5;
*p = &i;
return ;
}
執行結果 5 按照前面例子來說區域性變數i在函式執行完後應該被釋放了,為什麼p還可以訪問i的地址,並且輸出的值也是正確的呢。
其實這時候i的地址已經釋放,只是這時候系統沒有修改它,內容還在,下面通過讓系統申請記憶體來觀察i中儲存的值
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main(void)
{
void fun(char **p);
int *p1 = NULL;
fun(&p1);
printf("%d\n",*p1);//打印出來是5
int *ptr = (int*)malloc(sizeof(int)*10);
memset(ptr,1 ,sizeof(int)*10);
printf("%d\n",*p1);//此處打印出來的值不一定是5,但也不一定 是1
return 0;
}
void fun(char **p)
{
int i = 5;
*p = &i;
return ;
}