C語言全域性變數的問題,怎麼看,c語言中全域性變數及輸出問題?

2022-08-19 12:10:13 字數 4231 閱讀 7225

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的值,所以不要把指標...