變數名,變數值和記憶體地址,這三者在記憶體中是以某種編碼方式儲存在同一塊空間裡嗎

2022-03-11 03:54:45 字數 5683 閱讀 4307

1樓:風若遠去何人留

不是變數名,除非是除錯版本,否則不帶有變數名資訊如果是除錯版本,會單獨儲存在一段空間,供除錯工具讀取,所以和實際執行的記憶體完全不同

變數值,根據變數型別,存在堆區或者棧區

變數地址,除非儲存為指標,否則不會儲存變數地址

2樓:混天聊日

char 資料型別是佔一位元組,所以:sizeof(a) = 1個位元組

儲存資料的記憶體地址(對於 32 為系統)是32位,即 4 位元組,所以:sizeof(&a) = 4個位元組

變數名儲存的地址,是在棧中。

知道資料內容和變數名是分開儲存:

最好順便將堆、棧的概念弄清楚,舉個例子,如:

倉庫,可以分為管理區和儲存區,當然,管理區可以存放標識貨物儲存在儲存區位置的標識牌,也可以儲存貨物。

char a; ,相當於在管理區(棧)中的一個位置吧儲存了一件貨物,&a 相當於獲取這件貨物在管理區的位置(記憶體地址)。當然,管理區也要編號。

char *pa 相當於在管理區(棧)申請一個位置,用於存放貨物指示牌,pa = new char[100],new char[100] 相當於在貨物儲存區(棧)申請了一塊區域,pa = new char[100],相當於在指示牌 pa 上標明這個貨物儲存區的位置。

棧(記憶體)是靜態的,程式設計時就確定,當然記憶體釋放不用人工干預。堆(記憶體)是動態的,在程式執行是由你寫的**申請的,當然記憶體釋放由你決定。

3樓:

應該不是,看你怎麼存

c語言中對一個定義一個變數就是為其在記憶體中分配一個空間,那個空間最開始從哪分配起?

4樓:娜傑真愛一生

一個由c/c++編譯的程式佔用的記憶體分為以下幾個部分:

①棧區(stack)- 程式執行時由編譯器自動分配,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。程式結束時由編譯器自動釋放。

②堆區(heap) - 在記憶體開闢另一塊儲存區域。一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列。

③全域性區(靜態區)(static)-編譯器編譯時即分配記憶體。全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後由系統釋放

④文字常量區 -常量字串就是放在這裡的。 程式結束後由系統釋放。

⑤程式**區-存放函式體的二進位制**。

分配記憶體,是指在記憶體中找個地方給這個變數,在邏輯空間上同一型別的變數是在一起的。

但是,我們現在的系統都是分頁分段管理的,所以會出現了邏輯地址和實體地址兩個概念。

邏輯地址,對於每個程式都是一樣的,變數在一起、常量又在另外的地方,還有**段、資料段等。實體地址,就是實實在在的記憶體(也可能是硬碟)了。

j**a程式執行時,沒有賦值的基本型別變數會在記憶體中分配空間嗎? 20

5樓:匿名使用者

看不懂你說什麼,不過好像大致沒錯,你說的這種情況和普通物件類似.

簡單說,棧存的是地址,堆存的是具體資料

你說的沒有賦值的基本型別,比如方法中的基本型別就這樣的情況不過不賦處置,編譯器都過不了

不賦初值的不是你說的這種情況

6樓:x證

要看你這句int a處於什麼地方,如果是在方法內部中被執行到,也就是說是區域性變數,就會在棧記憶體中分配記憶體,由於是int型,所以就是4位元組,也就是32bit,long型別的才會是64bit。

而你說的表示地址我們稱為堆記憶體。建立的物件以及物件中的方法和資料是儲存在堆記憶體中的。jvm會在棧記憶體中建立物件的引用,然後當執行到new語句時,在堆記憶體中建立物件,這時就將這個物件的型別以及這塊區域的記憶體地址值賦給引用,然後進行物件中資料的初始化。

也就是說,物件的引用儲存在棧記憶體中,存放的是型別以及hash值,如integer@0xff67。而物件裡的內容實際上是儲存在堆記憶體中的。

如果你這句int a只是在某個物件內作為成員變數,那麼根本不會涉及到棧記憶體。a就儲存在它所在的那個物件的堆記憶體中。明白了麼?

c語言中對一個定義一個變數就是為其在記憶體中分配一個空間,那個空間最開始從哪分配起呢?

7樓:匿名使用者

分配記憶體,是指在記憶體中找個地方給這個變數,在邏輯空間上同一型別的變數是在一起的。

但是,我們現在的系統都是分頁分段管理的,所以會出現了邏輯地址和實體地址兩個概念。

邏輯地址,對於每個程式都是一樣的,變數在一起、常量又在另外的地方,還有**段、資料段等。

實體地址,就是實實在在的記憶體(也可能是硬碟)了,程式的資料究竟放在那塊記憶體由作業系統決定。

8樓:超人小笨蛋

c語言中的記憶體分配從地地址到高地址依次分為程式地址區域、文字常量地址區域、全域性變數地址區域、空閒區域(堆)地址區域、棧地址區域、作業系統地址區域。細說那就說來話長了,你可以找找講c的書,裡面一般會講儲存管理。

簡而言之,

一:像全域性變數、靜態變數這些能在編譯時就能確定其記憶體空間的變數,就採用靜態儲存分配分配到全域性變數地址區域;

二:棧式儲存分配,編譯器在編譯時僅知道程式變數所需空間,到執行時才為其分配地址的,就分配到棧地址區域;

三:堆式儲存分配,堆由大片可利用塊或空閒塊組成,堆中的記憶體可以按任意順序分配和釋放。在程式編譯無法確定資料塊大小時(如可變長度的字串),可在堆中分配記憶體空間;c語言在執行時進行的動態記憶體分配都是在堆中進行的

c語言中,int a=0;變數名a和數值是怎麼在記憶體分配的

9樓:yeara洛

這個是看變數的型別。

1、棧區(stack):又編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,其操作方式類似於資料結構的棧。

2、堆區(heap):一般是由程式設計師分配釋放,若程式設計師不釋放的話,程式結束時可能由os**,值得注意的是他與資料結構的堆是兩回事,分配方式倒是類似於資料結構的連結串列。

3、全域性區(static):也叫靜態資料記憶體空間,儲存全域性變數和靜態變數,全域性變數和靜態變數的儲存是放一塊的,初始化的全域性變數和靜態變數放一塊區域,沒有初始化的在相鄰的另一塊區域,程式結束後由系統釋放。

4、文字常量區:常量字串就是放在這裡,程式結束後由系統釋放。

5、程式**區:存放函式體的二進位制**。

堆和棧的區別:

1、由以上綜述就可以得知,他們程式的記憶體分配方式不同。

2、申請和響應不同:

(1)申請方式:

stack由系統自動分配,系統收回;heap需要程式設計師自己申請,c中用函式malloc分配空間,用free釋放,c++用new分配,用delete釋放。

(2)申請後系統的響應:

棧:只要棧的剩餘空間大於所申請的空間,體統將為程式提供記憶體,否則將報異常提示棧溢位。

堆:首先應該知道作業系統有一個記錄記憶體地址的連結串列,當系統收到程式的申請時,會遍歷該連結串列,尋找第一個空間大於所申請的空間的堆結點,然後將該結點從空閒結點連結串列中刪除,並將該結點的空間分配給程式。另外,對於大多數系統,會在這塊記憶體空間中的首地址處記錄本次分配的大小,這樣**中的delete或free語句就能夠正確的釋放本記憶體空間。

另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會將多餘的那部分重新放入空閒連結串列中。

3、申請的大小限制不同:

棧:在windows下,棧是向低地址擴充套件的資料結構,是一塊連續的記憶體區域,棧頂的地址和棧的最大容量是系統預先規定好的,能從棧獲得的空間較小。

堆:堆是向高地址擴充套件的資料結構,是不連續的記憶體區域,這是由於系統是由連結串列在儲存空閒記憶體地址,自然堆就是不連續的記憶體區域,且連結串列的遍歷也是從低地址向高地址遍歷的,堆得大小受限於計算機系統的有效虛擬記憶體空間,由此空間,堆獲得的空間比較靈活,也比較大。

4、申請的效率不同:

棧:棧由系統自動分配,速度快,但是程式設計師無法控制。

堆:堆是有程式設計師自己分配,速度較慢,容易產生碎片,不過用起來方便。

5、堆和棧的儲存內容不同:

棧:在函式呼叫時,第一個進棧的是主函式中函式呼叫後的下一條指令的地址,然後是函式的各個引數,在大多數的c編譯器中,引數是從右往左入棧的,當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的地址,也就是主函式中的下一條指令。

10樓:東風冷雪

a只是名子,int分配4個位元組空間,數值放在這篇空間中。。

11樓:王佳翀

系統會先劃分一片4位元組的空間,到定義int a的時候只是劃分一個區域裡面可能有數值的。因為記憶體可能沒有清除。

12樓:

簡單點說,c程式記憶體佈局有bss段,data資料段與.text**段

而int a=0屬於初始化了全域性or區域性變數.那麼0這個資料應該是儲存在.data資料段中.佔4個位元組.

而a變數這個名字,實際是不佔記憶體的,但程式執行需要找到0這個值,執行時需要一個地址指向data中0的位置,這個地址本身也是佔空間的,可以理解為a所佔記憶體吧.

c++中兩個區域性變數和全域性變數,變數名相同,請問記憶體空間如何分配?

13樓:小兆

因為整個程式裡只有一句int x;也就是隻有一個宣告x變數的語句。這樣一來程式裡使用的所有x都是同一個變數。只不過宣告的時候你沒有初始化而是在main函式裡初始化為5,然後在cude函式裡求3次方運算又返回給了x,這樣毫無疑問的x的值就是5的3次方了。

x的記憶體只有一個全域性的。

14樓:

第一點:一個由 c/c++編譯的程式佔用的記憶體分為以下幾個部分

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式

類似於資料結構中的棧。

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由 os ** 。

注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列,呵呵。

3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數

和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結

束後有系統釋放

4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放

5、程式**區—存放函式體的二進位制**。

例子程式:

//main.cpp

int a = 0; 全域性初始化區

char *p1; 全域性未初始化區

main()

第二點:關於函式呼叫:

在函式呼叫時,第一個進棧的是主函式中後的下一條指令(函式呼叫語句的下一條可執行語

句)的地址,然後是函式的各個引數,在大多數的 c 編譯器中,引數是由右往左入棧的,然後是函式

中的區域性變數。注意靜態變數是不入棧的。

當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的地址,也就

是主函式中的下一條指令,程式由該點繼續執行。

第三點:關於變數的作用域:

變數類別 子類別

靜態變數(離開函式,變數值仍保留)

區域性變數 自動變數

暫存器變數

全域性變數 靜態變數(只能在本檔案中用)

非靜態變數(允許其他檔案使用)

php function括號裡 類名變數名 這種寫法是什麼意思

php本來是弱型別語言,經過這幾年的發展,php也支援了型別判斷,比如可以宣告一專個屬函式變數為 function test int a int 對於類名,變數名這種寫法,是php5中引入的,這樣目的就是對引數進行限定,可以提前判斷出不符合型別的變數傳入。依賴注入是一種設計模式,而它依賴的就是這個功...

matlab如何給一組變數賦矩陣值 變數名在矩陣中,給每變數名賦

可以這樣 p a eval p,num2str 1 zeros 3,3 matlab 如何給矩陣中的變數賦一組值 是說每個theta各有五個值要對應著付給t嗎?可以先使用 syms theta1 theta2 theta3 theta4 theta5 然後給出t,之後分別給每個theta賦值,最後使...

SPSS17 0轉換計算變數時,出現變數名不正確 要麼名稱超過字元,要麼沒有被前面的命令定義。求高手

你的資料錄入這一步就有問題 我經常幫別人做這類的資料統計分析的 spss中計算變數時出現變數名不正確,要麼名稱超過64個字元,要麼沒有被前面的命令定義,什麼意思 你的變數名字肯定是錯誤了 要麼就是很多用了中文名字,具體問題具體分析吧 spss19.0中文版,在做線性迴歸時出現變數名不正確 要麼名稱超...