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 輸出...