1. 程式人生 > >函式內定義非靜態區域性變數當函式執行結束後自動釋放

函式內定義非靜態區域性變數當函式執行結束後自動釋放

#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 ; }