c 的變數儲存類別有以下四種

  • extern
  • auto
  • register
  • static
  • 常數

extern

extern 可以用在變數或函式上,用來告訴編輯器該函數或變數已在其他檔案宣告過,不用在配置記憶體。

//file.c
int a = 5;
//file2.c
#include <stdio.h>
#include "file.c"
extern int a;
int main()
{
	ptintf("%d\n",a);		//print 5
	a = 6;
	ptintf("%d\n",a);		//print 6
}

auto

對於區域變數來說 auto 是預設的儲存類別

#include "stdio.h"
int main()
{
	int a = 5;
	auto int b =3;
	printf("%d\n", a+b);
	return 0;
}

a 跟 b的宣告是一樣的,auto 的生命週期是在{}裡

register

register 只能用在區域變數上,且只能定義整數或字元,主要是標記長期使用的變數,將他存入暫存器,使他可以快速存取

#include <stdio.h>
int main()
{
	register int i,sum=0;
	for (i=0; i < 10; i++) {
		sum+=i;
	}
	printf("%d\n",sum );
	return 0;
}

static

#include <stdio.h>
int sum()
{
	static int a = 5;
	auto int b = 5;
	a++; b++;
	return a+b;
}
int main()
{
	for(int i=0; i<5; i++){
		printf("%d\n", sum()); // 12 13 14 15 16
	}
	return 0;
}

常數

常數會儲存在 text 區域

#include <stdio.h>
char *s = "hello";
int main()
{
	char *t = "hello";
	if (t==s) printf("%s\n","The addres is same" );
	else printf("%s\n","The addres is'n same" );

	return 0;
}

總結

類型 生命週期 儲存位置
auto variable { } 裡 變數的預設儲存位置,位於 heap
extern function 整個程式 變數的預設儲存位置,位於 text
extern variable 整個程式 初始化在data,未初始化在BSS
static function 當前檔案 text
static global variable 當前檔案 初始化在data,未初始化在BSS
static local variable { } 裡 初始化在data,未初始化在BSS
register variable { } 裡 執行時儲存於 CPU 暫存器裡
字串常數 當前檔案 text