只读字符串的c语言命令,C语言只读空间 - C 语言程序设计
我們現(xiàn)在看向內(nèi)存中的只讀數(shù)據(jù)段和代碼段構(gòu)成的只讀空間的概念。
代碼段
當(dāng)程序越來(lái)越多,代碼段也就越來(lái)越大。代碼段里面的代碼是不可以在運(yùn)行的時(shí)候被修改的,在編譯的時(shí)候就已經(jīng)定格了。如果我們?cè)噲D去寫(xiě)它,就一定會(huì)出現(xiàn)段錯(cuò)誤。
測(cè)試代碼如下
我們定義了一個(gè)unsigned char類型的指針去指向main函數(shù)的地址,強(qiáng)制轉(zhuǎn)換之后告訴編譯器我們需要用這樣方式讀取。在獲取到main函數(shù)地址之后,我們對(duì)這個(gè)字節(jié)的內(nèi)容進(jìn)行讀取;然后再將它的值試圖修改,然后再輸出。
運(yùn)行結(jié)果如下
我們成功的訪問(wèn)到了main函數(shù)的地址里面的數(shù)據(jù),但是在試圖修改它的值的時(shí)候,編譯器報(bào)出了一個(gè)段錯(cuò)誤。一旦我們操作代碼段,操作系統(tǒng)就會(huì)認(rèn)為程序是非法程序,然后將程序關(guān)閉掉。
只讀數(shù)據(jù)段
下面就是一個(gè)關(guān)于只讀數(shù)據(jù)段的一個(gè)經(jīng)典錯(cuò)誤:
測(cè)試代碼如下
p1是一個(gè)普通的指針變量,但是它指向的卻是一個(gè)常量字符串,這個(gè)字符串就保存在只讀數(shù)據(jù)段中,它首先將這個(gè)字符串輸出了。在第二個(gè)打印函數(shù)中,我們打印的是一個(gè)字符串“Hello world”的地址,這樣可以看出它存儲(chǔ)的段。再下面我們?cè)噲D通過(guò)可變的指針去修改常量段的數(shù)據(jù)。
運(yùn)行結(jié)果如下:
打印了這個(gè)字符串,還獲取到了常量字符串的首地址,可以看到和我們的代碼段相隔很近。我們修改常量段導(dǎo)致了一個(gè)段錯(cuò)誤。
除了只讀空間和內(nèi)核空間以外,其它的空間就是一個(gè)可讀可寫(xiě)的空間。如果我們定義了一個(gè)const int a=10;通過(guò)一個(gè)指針去修改它,a的值是可以被修改的。因?yàn)閍是一個(gè)局部變量,系統(tǒng)不會(huì)將它放在只讀數(shù)據(jù)段中,會(huì)將它放在局部變量中,這就是C的定義方式。
我們可以通過(guò)size build命令查看各個(gè)段中的大小。紅色方框中為靜態(tài)的數(shù)據(jù)段,程序在運(yùn)行之前就被打包在那里。在匯編之后生成了一堆原材料,將這些原材料打包成一個(gè)可運(yùn)行程序,將這些數(shù)據(jù)分別放到這三個(gè)段中(代碼段(TEXT),只讀數(shù)據(jù)段(TEXT),全局的數(shù)據(jù)空間(data和bss)。
我們?cè)谄渲幸粋€(gè)輸出字符串的前面加了1234,由于他們是字符串,所以它們應(yīng)該比原來(lái)多了4個(gè)字節(jié)。(為什么我們沒(méi)有修改第一個(gè)輸出字符串the p1 is,是因?yàn)橄旅孢€有一個(gè)輸出相同的字符串,可能會(huì)因?yàn)榫幾g器的優(yōu)化導(dǎo)致代碼段的優(yōu)化保存,就不是添加四個(gè)字符了。)
運(yùn)行結(jié)果如下
我們可以看到前后之間的區(qū)別,text段的數(shù)據(jù)多了四個(gè)字節(jié),是因?yàn)槲覀兲砑恿怂膫€(gè)字符的結(jié)果。
對(duì)于我們嵌入式開(kāi)發(fā)而言,這個(gè)程序的代碼段就不能太大。比如路由器,它的成本比較低,flash存儲(chǔ)器非常小,只有一兩兆,如果我們的Text太多,占據(jù)了太多的空間,那么就顯得太多余臃腫。所以最終生成的Release版本的程序有些打印信息是要去掉的。我們?cè)趯?shí)際工程中,debug版本是無(wú)所謂的,但是Release版本我們就需要對(duì)一些字符串進(jìn)行裁剪,減小可執(zhí)行程序代碼的大小,尤其是嵌入式模板開(kāi)發(fā)中,這個(gè)非常關(guān)鍵。
總結(jié)
以上是生活随笔為你收集整理的只读字符串的c语言命令,C语言只读空间 - C 语言程序设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c语言作业皇帝的许诺,C语言函数大全(s
- 下一篇: 黑白子交换c语言思路,递归 算法思路和优