⑴ C語言中對一個定義一個變數就是為其在內存中分配一個空間,那個空間最開始從哪分配起呢
c語言中的內存分配從地地址到高地址依次分為程序地址區域、文字常量地址區域、全局變數地址區域、空閑區域(堆)地址區域、棧地址區域、操作系統地址區域。細說那就說來話長了,你可以找找講C的書,裡面一般會講存儲管理。
簡而言之,
一:像全局變數、靜態變數這些能在編譯時就能確定其內存空間的變數,就採用靜態存儲分配分配到全局變數地址區域;
二:棧式存儲分配,編譯器在編譯時僅知道程序變數所需空間,到運行時才為其分配地址的,就分配到棧地址區域;
三:堆式存儲分配,堆由大片可利用塊或空閑塊組成,堆中的內存可以按任意順序分配和釋放。在程序編譯無法確定數據塊大小時(如可變長度的字元串),可在堆中分配內存空間;C語言在運行時進行的動態內存分配都是在堆中進行的
⑵ c語言中編譯系統和操作系統誰為變數分配相應的存儲空間
編譯系統將程序編譯成可執行代碼
操作系統執行程序,按照可執行代碼需求為程序分配代碼空間、常量空間、變數空間、堆棧空間,然後執行程序。
⑶ java程序是在編譯的時候分配空間的嗎,如果不是那程序在什麼時候給變數分配內存空間
編譯的時候是不會分配空間的,只是將java代碼編譯成位元組碼。是在運行這段代碼的時候才會分配。javac XX.java是編譯代碼,java XX時候是運行代碼。舉個簡單的例子:
class Cs{
int a=1;
public void print(){
System.out.print("a="+a);
}
public static void main(String args[]){
Cs c=new Cs();
c.print();
}}
當你執行到Cs c=new Cs();的時候會初始化變數。將引用變數c放入棧內存,將變數a=1放入堆內存。
⑷ 全局變數在編譯時怎麼分配空間
關於這個問題,全局變數(成員變數)是在創建對象的時候分配內存的創建對象過程為1分配空間2遞歸的創建父類對象(無父類這步可省略)3初始化成員變數4調用構造方法創建一個對象
靜態變數是在類載入的時候分配空間的,靜態變數和對象沒有關系是在jvm第一次讀到一個類的時候載入信息的過程中分配空間的類載入過程為1載入父類(如果父類已經載入過,則不在載入)2初始化靜態屬性3按順序的初始化靜態代碼塊
初始化的前提就是分配空間
而且靜態變數在以後的創建對象的時候不在初始化所以一般用靜態來保存共享信息
希望對你有所幫助
⑸ (C語言)編譯時給全局變數和靜態變數分配存儲空間,運行時給局部變數分配存儲空間,這樣說對嗎
全局變數,靜態局部變數,靜態全局變數都在靜態存儲區分配空間,而局部變數在棧里分配空間
全局變數本身就是靜態存儲方式, 靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。而靜態全局變數則限制了其作用域,即只在定義該變數的源文件內有效,在同一源程序的其它源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。
⑹ java中的全局變數和靜態變數是在編譯時分配內存還是在載入時分配內存
全局變數是在創建對象的時候分配內存的 創建對象過程為
分配空間。
遞歸的創建父類對象。
初始化成員變數。
調用構造方法創建一個對象。
靜態變數是在類載入的時候分配空間的,靜態變數和對象沒有關系 是在JVM第一次讀到一個類的時候載入信息的過程中分配空間的 載入過程為
1 .載入父類(如果父類已經載入過,則不在載入)。
2.初始化靜態屬性 。
3 .按順序的初始化靜態代碼塊 初始化的前提就是分配空間 。
而且靜態變數在以後的創建對象的時候不在初始化 所以一般用靜態來保存共享信息