C語言中的全域性變數和區域性變數分別是指什麼

2022-02-22 08:11:29 字數 5408 閱讀 2126

1樓:桓河藏櫻

解答問題前,先說明一下,當全域性變數和區域性變數同名時,要看當前**所處的作用域,預設使用當前作用域內的同名區域性變數。

分析你所提供的**:

#include

int a = 4;

//全域性變數

int f(int n)

else

return t+a++;

// 此外的a是指f函式作用域內的靜態區域性變數,

// 每次f函式呼叫return後,此靜態區域性變數a自增1

}int main ( void )

根據以上,分析執行流程:

由上可知,s初始值為4;

當i=0時,第一次迴圈,呼叫f()函式,由於0%2為0,會進入else後**,此時t=0+7=7,呼叫f()函式的return時,會返回7+5=12,同時f()函式的靜態區域性變數a由5變為6(下次呼叫生效),s=4+12=16。

當i=1時,第二次迴圈,呼叫f()函式,由於1%2為1,會進入if後**,此時t=0+6=6,呼叫f()函式的return時,會返回6+6=12,同時f()函式的靜態區域性變數a由6變為7(下次呼叫生效),s=16+12=28。

當i=2時,迴圈終止,列印s值為28。

關於最後的問題,是因為f()函式中if後面的變數a作用域只限制在if後的花括號內,**退出該作用域後,該變數生存週期結束而被釋放,return中使用的a是f()函式中定義的靜態區域性變數a,所以,不管前者如何賦值,對return中的a沒有影響。

2樓:卷靜秀牧良

全域性變數是對於整個主程式而言的,區域性變數則是針對於你寫的某個函式而言的、、、

c語言中 區域性變數和全域性變數都是儲存在什麼區

3樓:

c語言中區域性變數存在棧裡,全域性變數存靜態儲存區。

區域性變數在棧空間上分配,這個區域性變數所在的函式被多次呼叫時,每次呼叫這個區域性變數在棧上的位置都不一定相同。區域性變數也可以在堆上動態分配,但是記得使用完這個堆空間後要釋放之。

全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性變數分配儲存區,程式行完畢就釋放。在程式執行過程中它們佔據固定的儲存單元,而不動態地進行分配和釋放;

擴充套件資料

c語言中區域性變數和全域性變數示例:

#include

#include

staticints1=0,s2=0,s3=0;//靜態變數放在靜態區

intg1=0,g2=0,g3=0;//全域性變數放在靜態區

voidmain()

staticints4=0,s5=0,s6=0;//靜態變數

inta1=0,a2=0,a3=0;//區域性變數放在棧區

charc1="aabb";//區域性變數放在棧區

char*c2="aabb";//字元常量放在靜態區

char*m1=(char*)malloc(1);//堆區

char*m2=(char*)malloc(1);//堆區

char*m3=(char*)malloc(1);//堆區

printf("動態資料區\n");

printf("c1\n",c1);

printf("靜態資料區\n");

printf("c2\n",c2);

4樓:匿名使用者

記憶體中供使用者使用的儲存空間分為三部分,

1、程式區

2、靜態儲存區

3、動態儲存區

全域性變數全部放在靜態儲存區中,而在動態儲存區中存放函式形式引數和自動變數(區域性變數)以及函式呼叫時的現場保護和返回地址,因為你知道的,函式呼叫是通過系統棧實現的。

5樓:匿名使用者

全域性變數和區域性靜態變數在記憶體靜態區;

區域性變數在棧區。

6樓:匿名使用者

全域性資料區:存放程式的全域性資料和靜態資料

堆區:存放程式的動態資料

c語言中的全域性變數和區域性變數

7樓:煙高興樸璠

區域性變數是在某一函式內定義的變數,有效區域在本函式裡。

全域性變數定義在函式外,全域性起作用。

8樓:庾楚雲

是區域性變數啊= =全域性變數是在函式值外定義的變數【包括主函式、所以在main函式中定義的變數也是區域性變數

9樓:

執行了一下,程式沒有問題啊

10樓:匿名使用者

你這個問題我沒有重現 但是大概問題出在哪我提兩點想法你的s只有5位長,而當你輸入一個字串的時候實際是將這個字串賦值給s並且在後面加上'\0'的結束符,所以你輸入 n長度的字串其實是需要n+1長度的字串來接的。當你輸入5位的字串的時候你的s已經發生溢位了,你試著將s[5]改為s[6]。

而全域性變數和區域性變數是不同的 儲存的空間不同 具體為什麼全域性變數可以我也不清楚 但是可以肯定 出現這樣的差別一定是你的**有問題

空號一號 所說的&s的問題是對的。你寫成&s其實就是沒有理解陣列就是指標的概念。但是這個問題又不是問題 因為對於陣列來說 s和 &s是同一個值 你不信可以printf("s=%p &s=%p", s, &s);試試,但是如果s是指標就不一樣了

11樓:空號一號

跟s定義在**沒關係,這個程式有錯誤:s[5]是一個陣列,那麼在程式裡寫s就是這個陣列的第一個元素的指標,而scanf要的就是指標,所以不應該寫&s而是s。即:

scanf("%s", s);

另外輸入長度大於5時會寫到陣列s的外面造成緩衝溢位,這是非常危險的情況,會導致程式接下來的行為無法**,甚至崩潰。

c語言.關於全域性變數與區域性變數

12樓:匿名使用者

初學者?

初學時別太糾結這種問題,糾結多了只會讓你更加迷糊。

a,b 是全域性變數沒錯,但main 裡不能使用b,因為編譯器在解析main函式時,變數b尚未定義。

c,d是區域性變數。

儲存上當然是不一樣,全域性變數存在於資料區,也就是程式一開始執行就存在了。而區域性變數只是當函式執行到那兒的時候才存在,函式退出立馬消失。

13樓:

你是不是打錯字了,a,b是全域性變數,c是函式引數,d是區域性變數。全域性變數所有函式裡面都能使用。區域性變數只能在定義過的函式裡使用。

14樓:安定

a b就是全域性變數 c d是區域性變數,還可以進行巨集定義,但巨集定義不是太好,不建議來用。main函式可以用b變數,但要在main函式裡面在定義一下。全域性變數和區域性變數的區別在於他們的作用域不同,區域性變數只在它的作用域裡起作用。

比如上面的c和b只在void asasfd()這個函式裡起作用,而a在整個程式裡起作用。

全域性變數、靜態全域性變數、靜態區域性變數和區域性變數的區別

15樓:匿名使用者

c++變數根據定義位置的不同,具有不同的作用域,作用域可分為6種:全域性作用域,區域性作用域,語句作用域,類作用域,命名作用域和檔案作用域。

從作用域看:

全域性變數具有全域性作用域。全域性變數只需在一個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包括全域性變數定義的原始檔需要用extern關鍵字再次宣告這個全域性變數。

靜態區域性變數具有區域性作用域。它只被初始化一次,自從第一次初始化直到程式與你新內閣結束都一直存在,他和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見。

區域性變數也只有區域性作用域,他是自動物件,他在程式執行期間不是一直存在,而是隻在函式執行期間存在,函式的一次呼叫結束後,變數就被撤銷,其所佔用的記憶體也被收回。

靜態全域性變數也具有全域性作用域,他與全域性變數的區別在於如果程式包含多個檔案的話,他作用於定義它的檔案裡,不能作用到其他檔案裡,即被static關鍵字修飾過的變數具有檔案作用域。這樣即使兩個不同的原始檔都定義了相同的靜態全域性變數,他們也是不同的變數。

從分配記憶體空間看:

全域性變數、靜態區域性變數、靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧分配空間。

全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上沒有什麼不同。區別在於非靜態全域性變數的作用域是整個源程式,當一個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。

而靜態全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效,在同一源程式的其他原始檔中不能使用它。由於靜態全域性變數的作用域侷限於一個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其他原始檔中引起錯誤。

1、靜態變數會被放在程式的靜態資料儲存區裡,這樣可以在下一次呼叫的時候還可以保持原來的賦值。這一點是他與堆疊變數和堆變數的區別

2、變數用static告知編譯器,自己僅僅在變數的作用域範圍內可見。這一點是他與全域性變數的區別。

從以上分析可以看出,把區域性變數改變為靜態變數後是改變了他的儲存方式,即改變了他的生存期。把全域性變數改變為靜態變數後是改變了他的作用域,限制了他的使用範圍,因此static這個說明符在不同的地方起的作用是不同的。

tips:

1、若全域性變數僅在單個檔案中訪問,則可以講這個變數修改為靜態全域性變數。

2、若全域性變數僅在單個函式中使用,則可以將這個變數修改為該函式的靜態區域性變數。

3、全域性變數、靜態區域性變數、靜態全域性變數都存放在靜態資料儲存區。

4、函式中必須要使用static變數的情況:當某函式的返回值為指標型別時,則必須是static的區域性變數的地址作為返回值,若為auto型別,則返回為錯指標。

16樓:孫映寒厚周

區域性變數

與其它三個有本質區別。

區域性變數,定義在函式內,

作用域為定義位置,到所在大括號結束。

每次執行到定義語句的時候,系統為該變數分配記憶體,當作用域結束後,記憶體被釋放。

而另外三個,都是在系統執行時就分配記憶體,在執行過程中都不會釋放,直到程式結束。

也就是說,區域性變數和其它三個,最明顯的區別:

1生命週期不同

2分配時間不同

3分配位置不同。

而另外三個,在這幾項上是相同的,之間的區別在於作用域。

全域性變數

,作用域為整個專案,不管在哪個檔案中,只要宣告後都可以使用。

靜態全域性變數,作用域為定義改變數的所在檔案。

而靜態區域性變數,作用域與普通區域性變數一樣,都是定義位置到所在大括號結束。

成員變數和區域性變數區別,java全域性變數和區域性變數的區別

樓主是否對類的概念已經清楚了?如果是的話,就很好解釋了。成員變數是類的一個組成部分,和類的方法處於同一級別 而區域性變數是為了讓方法 功能正常執行設立的一些臨時儲存單元,是專門服務於方法的。從概念上說,兩者是完全沒有關係的,但從應用上說,成員變數可能臨時做為區域性變數存在,而區域性變數也可能依賴或者...

易語言中變數全域性變數區域性變數常量之間有什麼區別

全域性變數就是整個程式都可以用的,比如你在子程式.按鈕1 被單擊下 建了一個變數a,在按鈕1下可以呼叫 但是到了.子程式 編輯框1 內容被改變 這個子程式下如果輸入變數a也可以呼叫的 區域性變數就是隻有一個子程式下可以使用的變數 就比如說這個變數a在 子程式.按鈕1 被單擊下 建立了,在.子程式 編...

區域性變數能否和全域性變數重名

可以重名。在程式中如果出現了相同的兩個變數,一個是區域性變數,一個是全域性變數,編譯可以通過,但是列印出的值是區域性變數的值,如果想列印全域性變數的值的話,在全域性變數之前加上 就可以了。例子 include using namespace std int a 定義全域性變數 int main 輸出...