一個(gè)簡單的c程序 c語言程序經(jīng)過編譯后,每條指令都有一個(gè)內(nèi)存地址,那兩個(gè)程序如果有相同內(nèi)存地址的指令怎么辦?
c語言程序經(jīng)過編譯后,每條指令都有一個(gè)內(nèi)存地址,那兩個(gè)程序如果有相同內(nèi)存地址的指令怎么辦?將程序的代碼、數(shù)據(jù)和堆棧作為一塊完整的磚塊。編譯器是一個(gè)制磚機(jī),它安排了這個(gè)磚的內(nèi)部結(jié)構(gòu)。劃線系統(tǒng)只是一塊磚,
c語言程序經(jīng)過編譯后,每條指令都有一個(gè)內(nèi)存地址,那兩個(gè)程序如果有相同內(nèi)存地址的指令怎么辦?
將程序的代碼、數(shù)據(jù)和堆棧作為一塊完整的磚塊。編譯器是一個(gè)制磚機(jī),它安排了這個(gè)磚的內(nèi)部結(jié)構(gòu)。
劃線系統(tǒng)只是一塊磚,不會(huì)有互相覆蓋的矛盾。
如果您運(yùn)行多任務(wù)處理,則會(huì)有更多的磚塊。但在這個(gè)時(shí)候,操作系統(tǒng)通常是用來管理磚塊的。堆放磚塊時(shí),每一塊磚塊都會(huì)給出不同的起始坐標(biāo),以確保兩塊磚塊不占一個(gè)空間。
早期的DOS操作系統(tǒng)規(guī)定每個(gè)程序塊的高度不應(yīng)超過1米。編譯器制作的每個(gè)程序塊都使用偏移地址0000H ffffh來區(qū)分單元,但是當(dāng)操作系統(tǒng)將程序塊移動(dòng)到物理內(nèi)存時(shí),它會(huì)給每個(gè)程序塊一個(gè)不同的段起始地址,偏移地址是物理地址。所以沒有重疊。
當(dāng)然,還有編譯器。除了構(gòu)建磚塊外,編譯器還將生成一個(gè)規(guī)范標(biāo)簽,告知操作系統(tǒng)磚塊的厚度,這樣操作系統(tǒng)就可以在不浪費(fèi)空間的情況下很好地堆疊磚塊。不同的操作系統(tǒng)有不同的標(biāo)簽格式,所以windows程序不能直接在Linux下運(yùn)行。
后來,MMU出現(xiàn)在處理器、內(nèi)存管理單元中,程序地址空間和物理地址空間之間的轉(zhuǎn)換變得更加復(fù)雜。但是,確保不同的程序不覆蓋自己的空間是一項(xiàng)基本要求。
程序可能會(huì)覆蓋其他程序空間,這可能是惡意代碼造成的。CPU的安全特性越來越強(qiáng),這是很少見的。
C或C 程序編譯時(shí)內(nèi)存分為幾個(gè)存儲(chǔ)區(qū)?
由C/C編譯的程序所占用的內(nèi)存分為以下部分:1。堆棧存儲(chǔ)函數(shù)參數(shù)和局部變量的值,在程序運(yùn)行時(shí)由編譯器自動(dòng)分配。其操作類似于數(shù)據(jù)結(jié)構(gòu)中的堆棧。它在程序結(jié)束時(shí)由編譯器自動(dòng)釋放。2堆-在內(nèi)存中創(chuàng)建另一個(gè)存儲(chǔ)區(qū)域。通常,它是由程序員分配和發(fā)布的。如果程序員不發(fā)布它,它可能會(huì)在程序結(jié)束時(shí)被操作系統(tǒng)回收。注意,它在數(shù)據(jù)結(jié)構(gòu)上與heap不同。分配方法類似鏈表,哈哈。三。靜態(tài)-編譯器在編譯時(shí)分配內(nèi)存。全局變量和靜態(tài)變量存儲(chǔ)在一個(gè)區(qū)域中。初始化的全局變量和靜態(tài)變量存儲(chǔ)在一個(gè)區(qū)域中。未初始化的全局變量和靜態(tài)變量存儲(chǔ)在另一個(gè)相鄰區(qū)域中。-程序結(jié)束后,系統(tǒng)將發(fā)布4。文本常量區(qū)域-常量字符串放在這里。程序完成后,系統(tǒng)發(fā)布5。程序代碼區(qū)-函數(shù)體的二進(jìn)制代碼。