1樓:
二者記憶體佔用方面沒什麼太大區別,都是在定義的時候就分配好全部的記憶體,並且是連續的記憶體分配。
唯一的區別就是a[100]=;會多一個初始化的過程。
其實,如果a[100]是全域性變數,定義的時候陣列的每個元素會自動初始化為0。如果是區域性變數的話,則不會自動初始化。這跟c語言對記憶體的管理有關。
簡單點說,全域性變數是在記憶體的靜態區,而區域性變數則是在堆疊區。
2樓:匿名使用者
可以確定,兩者佔用的記憶體是一樣的,這點不會有變化。
具體的初始化動作,不同的編譯系統可能採取的方法不一定完全一樣的,甚至你可以通過對編譯系統進行設定而選用不同的方法。
直接初始化,系統會在啟動**中進行初始化。你如果初始化為非零值,這些值會被單獨儲存在你的程式中,作為二進位制**的一部分。如果初始化全零值,不同的系統會有不同的策略,可能會識別非零值,有的不會。
如果不識別非零值,那麼當然也會在程式中儲存一些資料用於初始化你的陣列,這些資料可能全是零,如果識別非零值,那麼會直接清零這片記憶體區域。
不直接初始化的時候,系統可能自動把這片區域清零,也可能不會。
總之,不同的系統是不同的。如果初始化,系統可能會在程式中存一些常數用於初始化,記憶體佔用不會變,但程式可能變大。
3樓:李示羊
兩者都存放在程式記憶體的全域性區(靜態區)
全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放
4樓:mr_無所不知
a[100]也是定義,定義的時候也就分配了記憶體,只是記憶體的裡的內容是隨機的~所佔記憶體應該差不多~
5樓:
上面已經分配記憶體了,下面只是申明並沒有分配記憶體啊
c語言中全域性變數及輸出問題?
6樓:匿名使用者
static 變數 具有初值0,且在函式中的值會儲存不加static是auto變數,每次函式呼叫都是新的變數,不會預設分配初始值
在函式f中a有初值3,加static b,c有初值 0,每次函式呼叫 ++a,++b,++c,a,b,c的值都增加1
沒有static,每次函式呼叫 中 a有初值3,++a a=4 ,b,c無初值,其值不確定
7樓:飛向夢想飛向未來
static定義靜態變數 然後會初始化為0 ,static只會初始化一次,這個就是為什麼a的值會是4,5,6
8樓:萬年之後的今天
函式內部的static的變數不會被釋放
static int a;
int b;
void func(void)
在這裡,a與b都是全域性變數,二者的區別是,b可以被別的檔案使用,a只能在本檔案中使用,這是static對全域性變數的作用。
c和d的區別是,d是一個自動變數,func函式執行完後,d會自動被釋放。但c卻不會被釋放,下一次呼叫func函式時,c的值會保留上次的值繼續使用。
9樓:認不倒你
可參考
c語言中怎樣避免全域性變數的使用
10樓:匿名使用者
首先先要從高層設計來做,確定哪些資料,以及這些資料的操作。
然後才是實現的問題,比如將變數區域性化,使用函式引數等。
其實使用全域性變數也不見得就是壞事,只要存取方法得當,也不會造成什麼不良後果。
11樓:匿名使用者
一般程式中是避免過多使用全域性變數,這樣對函式或者模組之間的耦合性!你可是把每個函式中的全域性變數設定成靜態static的,這樣就可以在這個.c檔案中全域性使用,但是別的檔案中再重新定義這個變數也不會有衝突。
12樓:閃閃紅紅星
在函式之間傳遞區域性變數地址。
13樓:匿名使用者
要麼用指標傳引數,要麼隱含使用全域性變數
你再定義一個函式但是隱含使用static全域性變數在adc獲取是呼叫getsetadc(value,true);設定值在b.c 呼叫獲取值
int getsetadc(int value,bool isset)
14樓:封喉羽
指標!如果沒有學到指標的話就發動腦筋想一下吧。每個問題都有很多種解決方案的
c語言中關於全域性變數的使用問題
15樓:衡琨瑤拜田
在file1.c中能定義全域性變數嗎?好像要把全域性變數定義在stdafx.cpp中,然後在file2.c中extern....
c語言 全域性變數 可宣告問題
16樓:
這樣講是不正確的,static宣告變數後,變數的生存期為整個程式的生存期,而extern 修飾變數後,目的是在本檔案中引用其它檔案中的變數。
17樓:
全域性變數其實是定義在資料段的,extern只是為外部變數預留記憶體,而static是靜態宣告。
預設是static,全域性變數就是static的
18樓:匿名使用者
如果static和extern都沒有,表示定義一個全域性變數,其作用域限制在從定義開始到當前檔案結尾。
static的作用是將全域性變數的作用域限制在從定義開始到當前檔案結尾,且其他檔案不可以用extern來讓這個變數可見。
extern的作用是宣告一個已經在別處定義了的全域性變數,它不是重新定義新的全域性變數,而是起到擴充套件全域性變數作用域的作用。
a.c:
int i; //定義i變數,且可用extern去擴充套件它的範圍
static int j; //定義j變數,用static限定j只能在本檔案內使用
b.cextern int i; //正確,將i的作用域延伸到b.c中
extern int j; //錯誤,因為j在定義時被static限定
c語言如何定義全域性變數的問題?
19樓:gta小雞
你的標頭檔案是怎麼寫的,兩個c檔案是怎麼引用標頭檔案的
c語言標頭檔案定義全域性變數問題
20樓:灩麗
1、首先,我們可以在函式外面定義變數,就是全域性變數。
2、區域性變數可以與全域性變數同樣命名。
3、但是優先順序是區域性變數優先。
4、但是區域性變數的生命週期是整個結構內。
5、全域性變數是整個程式結束,才釋放。
6、我們也可以為變數加上修飾符。
21樓:吉祥二進位制
一般來說,不會將全域性變數的定義寫在標頭檔案中,因為如果多個c原始檔都新增了標頭檔案,那很容易引起重定義的問題,這時候一般編譯器都會提示。
正確的作法是在c原始檔中定義一個全域性變數。在標頭檔案中加入全域性變數的宣告。比如
//var.c 一個主要用於定義全域性變數的c原始檔int g_a;
char g_x;
//var.h 用於宣告定義的全域性變數
extern int g_a;
extern char g_x;
//test.c 一個用於測試的標頭檔案
#include
void f()
22樓:匿名使用者
你得理解:
我們把.c和.h分開是為什麼
連線做的事情就是把.c和.h又合在一起,不僅如此,還把abc都合在一起(而你的條件編譯指令僅限於第一個階段起作用!
);於是包含了int a宣告的a.o、b.o和c.
o在合成xx.out的時候,就有3次int a宣告;
通常正確的做法是:把」變數/函式宣告「放在.h,而把」變數/函式定義「放在.
c;那麼你的這句int a是宣告還是定義?從錯誤提示「。。。already defined。。。
」可以看出連結工具把它識別為「定義」而不是「宣告」。函式宣告不會有這種問題,而變數的宣告和定義(尤其在不帶初始化的情況下)就長的一模一樣。所以我的建議是,你不要糾結這個問題了,把這句int a放在a.
c裡面,然後去b.h和c.h裡面宣告extern int a(還要囉嗦一句,變數不要用一個字母a就概括了);
希望對你有幫助
c語言全域性變數的定義,C語言中如何定義全域性變數
在所有函式外部定義的變數稱為全域性變數 global variable 它的作用域預設是整個程式,也就是所有的原始檔,包括 c 和 h 檔案。例如 int a,b 全域性變數 void func1 todo float x,y 全域性變數 int func2 todo int main todo r...
c語言變數定義的位置問題
以花括號 給包圍起來的 段稱為block 我不知道它的準確中文翻譯是不是叫模組 只要在block開始的地方定義變數就不會錯,且該變數的作用域和生存期 除了static限定 只在該block裡,且該變數可以遮蔽block外的變數。譬如在block外已經有一個變數名為a 1的int變數,在block裡允...
關於C語言的問題,我是新手。新手如何入門C語言?
不大明白樓主的真正意思,我就按我對樓主問題的理解解釋了。指標變數儲存的是十六進位制記憶體地址的值,他也是一個值,為什麼叫他指標,因為他儲存的是一個地址。所謂函式的地址傳遞,也是值傳遞 地址值傳遞 如果你有一個指標不管他指向或不指向任何記憶體地址,他都有一個類似0x0012ff2c的值,所以不要把指標...