- 函數的動態(auto)變量是在棧存儲的。棧存儲的變量會在函數結束之後釋放掉。
- 靜態變量(static)是在數據區存儲,進程結束之後,纔會釋放。
一.動態變量
main函數通過調用test函數,test函數接收了fun函數局部變量a的存儲地址,但在接收之前,fun函數已經運行結束了,即局部變量a已經被釋放掉了,所以test函數再訪問a的時候,會提示段錯誤(編譯時也會有警告)。
#include <stdio.h>
void test(int *p)
{
(*p)++;
}
int* fun()
{
int a=5;
return &a;
}
int main()
{
int *p;
p=fun();
test(p);//fun函數已經結束
printf("%d\n",*p);
return 0;
}
main函數將局部變量a的存儲地址傳給test函數,因爲在test函數運行時,main函數還未結束,所以test函數能夠正常訪問局部變量a。
#include <stdio.h>
void test(int *p)
{
(*p)++;
}
int main()
{
int a=5;
test(&a);
printf("%d\n",a);//輸出6
return 0;
}
二.靜態變量
由於靜態局部變量a是存儲在數據區,即使fun函數已經結束了,但進程還未結束,所以test函數能夠正常訪問靜態局部變量a。
#include <stdio.h>
void test(int *p)
{
(*p)++;
}
int* fun()
{
static int a=5;//靜態局部變量
return &a;
}
int main()
{
int *p;
p=fun();
test(p);
printf("%d\n",*p);//輸出6
return 0;
}