1. 程式人生 > >全域性變數、區域性變數、靜態變數

全域性變數、區域性變數、靜態變數


1.全域性變數與靜態全域性變數的區別

       分配時間: 1)全域性變數在程式開始執行時分配

                            2)靜態全域性變數在程式開始執行時分配

       釋放時間: 1)全域性變數在程式結束時釋放
                            2)靜態全域性變數在程式結束時釋放
       作用域:     1)全域性變數可以在所有原始檔裡呼叫,其他檔案可以通過extern的方式引用
                            2)靜態全域性變數只作用於當前原始檔,不可以用extern擴充套件其作用域
       使用情況: 1)全域性變數:         a、所有原始檔共享
                            2)靜態全區變數: a、不必擔心其它原始檔使用相同變數名
                                                               b、不能被其他原始檔使用、修改或引用
2.區域性變數和靜態區域性變數的區別
      分配時間: 1)區域性變數在程式執行到時分配
                           2)靜態區域性變數在程式開始執行時分配
      釋放時間: 1)區域性變數在作用域結束時釋放
                           2)靜態區域性變數在程式結束時釋放
      作用域:     1)區域性變數僅在當前函式體
                           2)靜態區域性變數僅在當前函式體
      使用情況: 1)區域性變數: a、不帶 “內部儲存器”(靜態區域性變數)的可預測函式
                                                      b、可重入(中斷)函式

                           2)靜態區域性變數: a、不必擔心其它作用域使用相同變數名

                                                              b、帶“內部儲存器”的函式

                                                              c、返回值為指標型別的函式不能返回指向本函式棧記憶體單元的指標,因為函式結束棧被釋放,返回的是錯指標

注:
1.不同原始檔中全域性變數的分配順序可以通過將一個物件作為另一個物件建構函式的引數來保證他們的構造順序,作為引數的先被分配。
2.{}用於限制作用域,{}內為一個內層作用域。

3.未初始化的靜態變數和全域性變數將被初始化為空串或

0,未初始化的區域性變數的值不確定。

#include<stdio.h>			//返回錯指標的情況
char *func()
{
	char p[]="Hello World";		//存放棧中,函式退出記憶體被釋放
	return p;
}
int  main()
{
	printf("%s\n",func());
	return 0;
}

#include<stdio.h>
char *func()
{
	static char p[]="Hello World";	//存放在靜態儲存區,不會釋放
	return p;
}
int  main()
{
	printf("%s\n",func());
	return 0;
}

#include<stdio.h>			//靜態變數的作用域
static int a=1			
void func()
{
	printf("%d\n",a);
	static int a;
	a=2;
	printf("%d\n",a);
	{
		static int a;
		a=3;
		printf("%d\n",a);
	}
	printf("%d\n",a);
}
int  main()
{
	func();
	printf("%d\n",a);
	return 0;
}