當前位置:首頁 » 編程語言 » c語言靜態變數存放在數據段
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言靜態變數存放在數據段

發布時間: 2022-05-18 09:08:37

1. c語言中static定義的變數 存儲在OS內存的什麼區域

windows下,進程虛擬地址4G,0~2G屬於進程私有,
進程私有地址布局是:
兩端各有64k空間,以防指針值為空,
地址從低往高是代碼段、數據段、棧、堆,

static變數在數據段,具體是_DATA段,該段數據都已初始化

2. C語言中 局部變數和全局變數都是存儲在什麼區

C語言中局部變數存在棧里,全局變數存靜態存儲區。

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

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

(2)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);

}

3. c語言里什麼變數存儲在堆中什麼變數存儲在棧中啊!

函數的局部變數、參數一般在棧中分配空間存儲
也不是絕對的,編譯器可能會優化使用寄存器傳遞參數
不過可以顯式地規定函數的參數傳遞方式,可以查一下stdcall,fastcall等宏的具體定義和作用
局部變數中的靜態變數的空間在數據段中,不在棧中
程序中動態分配的空間,如malloc分配的空間位於堆中

4. C語言中,如果棧區空間不足,變數將存到哪裡 在內存中,靜態區、代碼區、堆區、棧區 有固定的排列順序嗎

1.棧空間(stack段)用來存放函數中的局部變數和函數調用時的上下文。
2. 全局變數和靜態變數存放於進程的數據段。
3. Windows下進程的棧空間會自動增長,一般不會出現空間不足的問題;
4。如果變數實在太大,甚至大於棧可增長的范圍,如數百兆,則會編譯出錯。

5. c語言中全局變數都是靜態儲存的嗎

不太嚴格的說,可以這么認為。
因為全局變數和靜態變數在內存里是儲存在一個地方的。叫
data
segment
(數據段),靜態區。意思是這個地方的數據的生命周期是不變的,只要程序本身在運行,他們就會存在。所以說他們都存在同一片區域內。
你能想到
靜態變數

全局變數
在使用的時候有什麼區別嗎?唯一的區別就是對於多個文件的訪問許可權,static
的變數只對本文件有效,而全局變數(除去const)對當前所有文件有效。main.cpp
可以訪問
foo.cpp
的全局變數,而不能訪問
foo.cpp
的靜態變數。
既然他們存在一個地方,如何區分呢。通過變數的
linkage
(即能否被鏈接器識別)屬性,internal
linkage
的變數只能被本文件訪問,而
external
linkage
的變數可以被其他文件訪問。就這個層面而言,你的想法不能說有錯。

6. c語言中的靜態存儲變數是存儲在哪裡的,一般什麼時候用

在棧中,這個是系統自己完成的,例如int a=4,而堆是可以由程序員進行隨時申請的這里的棧類似於數據結構中的棧,而堆類似與數據結構中的鏈表。

7. C語言的各種數據在內存中如何存儲

變數可以存儲在內存中的不同地方,這依賴於它們的生存期。在函數外部定義的變數(全局變數或靜態外部變數)和在函數內部定義的static變數,其生存期就是程序運行的全過程,這些變數被存儲在數據段(datasegment)中。數據段是在內存中為這些變數留出的一段大小固定的空間,它分為兩部分,一部分用來存放初始化變數,另一部分用來存放未初始化變數。 在函數內部定義的auto變數(沒有用關鍵字static定義的變數)的生存期從程序開始執行其所在的程序塊代碼時開始,到程序離開該程序塊時為止。作為函數參數的變數只在調用該函數期間存在。這些變數被存儲在棧(stack)中。棧是內存中的一段空間,開始很小,以後逐漸自動增大,直到達到某個預定義的界限。

8. c語言內存有幾種分配方式

基本上C程序的元素存儲在內存的時候有3種分配策略:
靜態分配
如果一個變數聲明為全局變數或者是函數的靜態變數,這個變數的存儲將使用靜態分配方式。靜態分配的內存一般會被編譯器放在數據段或代碼段來存儲,具體取決於實現。這樣做的前提是,在編譯時就必須確定變數的大小。 以IA32的x86平台及gcc編譯器為例,全局及靜態變數放在數據段的低端;全局及靜態常量放在代碼段的高端
自動分配
函數的自動局部變數應該隨著函數的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比於靜態分配,這時候,就不必絕對要求這個變數在編譯時就必須確定變數的大小,運行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放鬆了這個限制。但無論是C89還是C99,都不允許一個已經分配的自動變數運行時改變大小。
所以說C函數永遠不應該返回一個局部變數的地址。
要指出的是,自動分配也屬於動態分配,甚至可以用alloca函數來像分配堆(Heap)一樣進行分配,而且釋放是自動的。
動態分配
還有一種更加特殊的情況,變數的大小在運行時有可能改變,或者雖然單個變數大小不變,變數的數目卻有很大彈性,不能靜態分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函數是malloc、calloc、realloc和free。
使用堆(Heap)內存將帶來額外的開銷和風險。

9. c語言中靜態變數是怎麼用的

c語言中靜態變數作常量使用,用於存儲常數。可用const,constant或final等關鍵字標識,其值就會在編譯時設定,並且無法在運行時改變。編譯器通常將靜態常量與文本一起置於目標文件的文本區域,而非常量初始化數據則置於數據區;而如若有需要,有些編譯器還可選擇為其開辟專用區。

對於靜態全局變數來說,針對某一源文件的以static聲明的文件級變數與函數的作用域只限於文件內(只在文件內可見),也即「內部連接」,因而可以用來限定變數的作用域。

(9)c語言靜態變數存放在數據段擴展閱讀:

在函數內以static聲明的靜態局部變數雖然與自動局部變數的作用域相同(即作用域都只限於函數內),但存儲空間是以靜態分配而非默認的自動分配方式獲取的,因而存儲空間所在區域不同。

一般來說,靜態分配時存儲空間於編譯時在程序數據段分配,一次分配全程有效;而自動分配時存儲空間則是於調用棧上分配,只在調用時分配與釋放,且兩次調用間變數值始終保持一致;必須注意,靜態局部變數只能初始化一次,這是由編譯器來保證實現。

10. c語言常量變數在內存中的存儲方式

從靜態存儲區域分配:內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變數,static變數。

在棧上創建(地址從大到小):在執行函數時,函數內局部變數的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。(棧上的變數都具有臨時變數的特性)

從堆上分配(地址從小到大):亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自行負責在何時用free或delete釋放內存。

(10)c語言靜態變數存放在數據段擴展閱讀:

注意事項:

const在C語言中使用比較多,雖然變數由const修飾,但是從本質上仍然是變數,所以存儲在堆棧和靜態存儲區,這么區域從進程角度來講是可讀可寫,但為什麼const修飾後將變得不可寫了。

既然const變數所在區域的屬性為可讀可寫,那麼可以修改其所處內存的值了。

C語言const變數的作用說起:const是一個c語言的關鍵字,限定一個變數不允許被改變,產生靜態作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外在觀看別人代碼的時候,清晰理解const所起的作用,對理解對方的程序也有一些幫助。