① C語言中 局部變數和全局變數都是存儲在什麼區
C語言中局部變數存在棧里,全局變數存靜態存儲區。
局部變數在棧空間上分配,這個局部變數所在的函數被多次調用時,每次調用這個局部變數在棧上的位置都不一定相同。局部變數也可以在堆上動態分配,但是記得使用完這個堆空間後要釋放之。
全局變數全部存放在靜態存儲區,在程序開始執行時給全局變數分配存儲區,程序行完畢就釋放。在程序執行過程中它們占據固定的存儲單元,而不動態地進行分配和釋放;
(1)c編譯器將變數分配在哪些存儲器擴展閱讀
C語言中局部變數和全局變數示例:
#include<stdio.h>
#include<malloc.h>
staticints1=0,s2=0,s3=0;//靜態變數放在靜態區
intg1=0,g2=0,g3=0;//全局變數放在靜態區
voidmain()
{
staticints4=0,s5=0,s6=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//靜態變數
inta1=0,a2=0,a3=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//局部變數放在棧區
charc1[]="aabb";//局部變數放在棧區
char*c2="aabb";//字元常量放在靜態區
char*m1=(char*)malloc(1);//堆區
char*m2=(char*)malloc(1);//堆區
char*m3=(char*)malloc(1);//堆區
printf("動態數據區 ");
printf("a1 a2 a3 ",&a1,&a2,&a3);
printf("c1 ",c1);
printf("m1 m2 m3 ",&m1,&m2,&m3);
printf("靜態數據區 ");
printf("s1 s2 s3 ",&s1,&s2,&s3);
printf("g1 g2 g3 ",&g1,&g2,&g3);
printf("s4 s5 s6 ",&s4,&s5,&s6);
printf("c2 ",c2);
}
② C語言中全局變數存放在內存空間中那個位置
在 C 語言中,內存分配方式有以下三種形式:
1、從靜態存儲區域分配
由編譯器自動分配和釋放,在程序編譯的時候就已經分配好內存,這塊內存在程序的整個運行期間都存在,直到整個程序運行結束時才被釋放,如全局變數與 static 變數。
2、在棧上分配
同樣由編譯器自動分配和釋放,在函數執行時,函數內部的局部變數都可以在棧上創建,函數執行結束時,這些存儲單元將則被自動釋放。
需要注意的是,棧內存分配運算內置於處理器的指令集中,它的運行效率一般很高,但是分配的內存容量有限。
3、從堆上分配
也稱為動態內存分配,由程序員手動完成申請和釋放。程序在運行的時,由程序員使用內存分配函數(如 malloc 函數)來申請內存,使用完之後再由程序員自己負責使用內存釋放函數(如 free 函數)來釋放內存。
需要注意的是,如果在堆上分配了內存空間,就必須及時釋放它,否則將會導致運行的程序出現內存泄漏等錯誤。
在 C 語言中,不同類型變數的存儲位置和作用域也有所不同。
全局變數
從靜態存儲區域分配,其作用域是全局作用域,也就是整個程序的生命周期內都可以使用。如果程序是由多個源文件構成的,那麼全局變數只要在一個文件中定義,就可以在其他所有的文件中使用,但必須在其他文件中通過使用extern關鍵字來聲明該全局變數。
全局靜態變數
從靜態存儲區域分配,其生命周期也是與整個程序同在的,從程序開始到結束一直起作用。與全局變數不同的是,全局靜態變數作用域只在定義它的一個源文件內,其他源文件不能使用。
局部變數
從棧上分配,其作用域只是在局部函數內,在定義該變數的函數內,只要出了該函數,該局部變數就不再起作用,也即該變數的生命周期和該函數同在。
局部靜態變數
從靜態存儲區域分配,其在第一次初始化後就一直存在直到程序結束。該變數的特點是其作用域只在定義它的函數內可見,出了該函數就不可見了。
③ c編譯器將變數分配在 什麼存儲器
DEV C++TurboC2.0Visual studio 6.0Code::Blocks以上幾款編輯器都可以在64位系統中運用。按照步驟如下:以Code::Blocks為例1首先下載下載Codeblocks這個軟體,目前最新版本是13.12,2這個軟體是英文的,所以軟體是英文界面,建議讀者使用英文版,不要去使用漢化版本,畢竟C語言是外國人開發的,所以用英文的界面會比較適合以後的能力提供,這個界面直接點擊【I Agree】,進如下一步安裝3這個是選擇安裝模式的界面,一般你的電腦是一個賬戶的,不是多人使用的電腦,所以這里選擇Full就行了,就是給電腦所有用戶安裝4來到這個界面選擇安裝路徑,這里強烈建議修改下安裝路徑,不建議使用默認的路徑,默認的路徑中【Program Files】中有一個空格,以後安裝一個插件可能會出問題,所以建議自己建立一個文件作為該軟體的安裝路徑,比如這里是在D盤建立了一個Develop的文件夾,作為開發軟體的安裝路徑,然後安裝路徑就選擇了D:\Develop\CodeBlocks,這里可以根據自己實際情況定義。5安裝結束之後,彈出提示是否運行Code::Blocks,這里都可以選,選擇運行6Code::Blocks的啟動界面,這里是13.12版本,在上述經驗有說到7這個直接選擇Set as default就行了,因為此時你還沒有安裝其他的插件,所以其他的選項是灰色的,然後點擊OK8緊接著看到的就是軟體的這界面,這個界面就是Code::Blocks的界面
④ C語言的變數根據分配的存儲空間的不同 可以分為哪三種變數
C語言變數存儲類型
auto
static
extern
static extern
register
auto 局部變數
auto 變數是用堆棧(stack)方式佔用儲存器空間,因此,當執行此區段是,系統會立即為這個變數分配存儲器空間,而程序執行完後,這個堆棧立即被系統收回.在大括弧{}內聲明.
自動變數就是指在函數內部定義使用的變數。他只是允許在定義他的函數內部使用它。在函數外的其他任何地方都不能使用的變數。自動變數是局部變數,即它的區域性是在定義他的函數內部有效。當然這說明自動變數也沒有鏈接性,因為它也不允許其他的文件訪問他。由於自動變數在定義他的函數的外面的任何地方都是不可見的,所以允許我們在這個函數外的其他地方或者是其他的函數內部定義同名的變數,他們之間不會發生沖突的。因為他們都有自己的區域性,而且它沒有鏈接性(即:不允許其他的文件訪問他的)。來看看自動量的持續性。計算機在執行這個函數的時候,創建並為它分配內存,當函數執行完畢返回後,自動變數就會被銷毀。這個過程是通過一個堆棧的機制來實現的。為自動變數分配內存就壓棧,而函數返回時就退棧。
static 靜態變數
一、局部靜態變數
局部變數按照存儲形式可分為三種auto, static, register。
與auto類型(普通)局部變數相比, static局部變數有三點不同:
1. 存儲空間分配不同
auto類型分配在棧上, 屬於動態存儲類別, 占動態存儲區空間, 函數調用結束後自動釋放, 而static分配在靜態存儲區, 在程序整個運行期間都不釋放. 兩者之間的作用域相同, 但生存期不同.
2. static局部變數在所處模塊在初次運行時進行初始化工作, 且只操作一次。
3. 對於局部靜態變數, 如果不賦初值, 編譯期會自動賦初值0或空字元, 而auto類型的初值是不確定的.
特點: static局部變數的」記憶性」與生存期的」全局性」
所謂」記憶性」是指在兩次函數調用時, 在第二次調用進入時, 能保持第一次調用退出時的值.
注意事項:
1. 「記憶性」, 程序運行很重要的一點就是可重復性, 而static變數的」記憶性」破壞了這種可重復性, 造成不同時刻至運行的結果可能不同.
2. 「生存期」全局性和唯一性. 普通的local變數的存儲空間分配在stack上, 因此每次調用函數時, 分配的空間都可能不一樣, 而static具有全局唯一性的特點, 每次調用時, 都指向同一塊內存, 這就造成一個很重要的問題 ---- 不可重入性!!!
二、外部靜態變數/函數
在C中static有了第二種含義:用來表示不能被其它文件訪問的全局變數和函數。, 但為了限制全局變數/函數的作用域, 函數或變數前加static使得函數成為靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的作用域僅局限於本文件(所以又稱內部函數)。注意此時, 對於外部(全局)變數, 不論是否有static限制, 它的存儲區域都是在靜態存儲區, 生存期都是全局的. 此時的static只是起作用域限製作用, 限定作用域在本模塊(文件)內部.
使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。
extern 變數
外部變數 定義在程序外部,所有的函數很程序段都可以使用.
外部變數可能會在某一程序段被重新定義,以段內變數為參考值.
static extern 變數
靜態外部變數和外部變數差別在於,外部變數生命可以同時給多個文件使用,而靜態外部變數則只能給聲明此變數的文件使用.
register 變數
寄存器變數,是由寄存器分配空間,訪問速度比訪問內存快,加快執行速度.寄存器大小有限.
在c語言當中可以使用寄存器變數來優化程序的性能,最常見的是在一個函數體當中,將一個常用的變數聲明為寄存器變數: register int ra; 如果可能的話,編譯器就會為它分配一個單獨的寄存器,在整個函數執行期間對這個變數的操作全都是對這個寄存器進行操作,這時候就不用頻繁地去訪存了,自然就提高了性能。
不能用於全局變數。現在的情況是VC忽略用戶定義的REGISTER,因此定義一個REGISTER變數與不定義一個REGISTER是一樣的,編譯器進行相同的優化,因為MS認為,REGISTER是系統中寶貴的資源,應該由系統統一調配,而且認為VC編譯器的優化能力要大於一般的程序員。因此也有人說register關鍵字在PC機(x86CPU)無用,編譯器按自動變數處理。
注意: register是不能取址的。
register int j; int *p = &j;是錯的,因為無法對寄存器的定址。
【摘自http://..com/link?url=-j__t2Ou7LNCgyoA8N06a】
⑤ C語言中對一個定義一個變數就是為其在內存中分配一個空間,那個空間最開始從哪分配起呢
c語言中的內存分配從地地址到高地址依次分為程序地址區域、文字常量地址區域、全局變數地址區域、空閑區域(堆)地址區域、棧地址區域、操作系統地址區域。細說那就說來話長了,你可以找找講C的書,裡面一般會講存儲管理。
簡而言之,
一:像全局變數、靜態變數這些能在編譯時就能確定其內存空間的變數,就採用靜態存儲分配分配到全局變數地址區域;
二:棧式存儲分配,編譯器在編譯時僅知道程序變數所需空間,到運行時才為其分配地址的,就分配到棧地址區域;
三:堆式存儲分配,堆由大片可利用塊或空閑塊組成,堆中的內存可以按任意順序分配和釋放。在程序編譯無法確定數據塊大小時(如可變長度的字元串),可在堆中分配內存空間;C語言在運行時進行的動態內存分配都是在堆中進行的
⑥ c語言內存有幾種分配方式
基本上C程序的元素存儲在內存的時候有3種分配策略:
靜態分配
如果一個變數聲明為全局變數或者是函數的靜態變數,這個變數的存儲將使用靜態分配方式。靜態分配的內存一般會被編譯器放在數據段或代碼段來存儲,具體取決於實現。這樣做的前提是,在編譯時就必須確定變數的大小。 以IA32的x86平台及gcc編譯器為例,全局及靜態變數放在數據段的低端;全局及靜態常量放在代碼段的高端
自動分配
函數的自動局部變數應該隨著函數的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比於靜態分配,這時候,就不必絕對要求這個變數在編譯時就必須確定變數的大小,運行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放鬆了這個限制。但無論是C89還是C99,都不允許一個已經分配的自動變數運行時改變大小。
所以說C函數永遠不應該返回一個局部變數的地址。
要指出的是,自動分配也屬於動態分配,甚至可以用alloca函數來像分配堆(Heap)一樣進行分配,而且釋放是自動的。
動態分配
還有一種更加特殊的情況,變數的大小在運行時有可能改變,或者雖然單個變數大小不變,變數的數目卻有很大彈性,不能靜態分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函數是malloc、calloc、realloc和free。
使用堆(Heap)內存將帶來額外的開銷和風險。
⑦ C語言中變數存儲類型有哪些
turbo
c2.0支持四種變數存儲類型。說明符如下:
auto
static
extern
register
下面分別來介紹。
一、auto
auto稱為自動變數。
局部變數是指在函數內部說明的變數(有時也稱為自動變數)。用關鍵字auto進
行說明,
當auto省略時,
所有的非全程變數都被認為是局部變數,
所以auto實際上
從來不用。
局部變數在函數調用時自動產生,
但不會自動初始化,
隨函數調用的結束,
這
個變數也就自動消失了,
下次調用此函數時再自動產生,
還要再賦值,
退出時又自
動消失。
二、static
static稱為靜態變數。根據變數的類型可以分為靜態局部變數和靜態全程變數。
1.
靜態局部變數
它與局部變數的區別在於:
在函數退出時,
這個變數始終存在,
但不能被其它
函數使用,
當再次進入該函數時,
將保存上次的結果。其它與局部變數一樣。
2.
靜態全程變數
turbo
c2.0允許將大型程序分成若干獨立模塊文件分別編譯,
然後將所有模塊
的目標文件連接在一起,
從而提高編譯速度,
同時也便於軟體的管理和維護。靜態
全程變數就是指只在定義它的源文件中可見而在其它源文件中不可見的變數。它與
全程變數的區別是:
全程變數可以再說明為外部變數(extern),
被其它源文件使用,
而靜態全程變數卻不能再被說明為外部的,
即只能被所在的源文件使用。
三、extern
extern稱為外部變數。為了使變數除了在定義它的源文件中可以使用外,
還要
被其它文件使用。因此,
必須將全程變數通知每一個程序模塊文件,
此時可用
extern來說明。
四、register
register稱為寄存器變數。它只能用於整型和字元型變數。定義符register說
明的變數被turbo
c2.0存儲在cpu的寄存器中,
而不是象普通的變數那樣存儲在內
存中,
這樣可以提高運算速度。但是turbo
c2.0隻允許同時定義兩個寄存器變數,
一旦超過兩個,
編譯程序會自動地將超過限制數目的寄存器變數當作非寄存器變數
來處理。因此,
寄存器變數常用在同一變數名頻繁出現的地方。
另外,
寄存器變數只適用於局部變數和函數的形式參數,
它屬於auto型變數,
因此,
不能用作全程變數。定義一個整型寄存器變數可寫成:
register
int
a;
對於以上所介紹的變數類型和變數存儲類型將會在以後的學習中,
通過例行程
序中的定義、使用來逐漸加深理解。