C語言坑之局部變量

  1. 函數的動態(auto)變量是在棧存儲的。棧存儲的變量會在函數結束之後釋放掉。
  2. 靜態變量(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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章