關於內存及字符數組,字符串的一些注意點

1、數據段(也被稱爲數據區、靜態數據區、靜態區):數據段就是程序中的數據,直觀理解就是C語言程序中的全局變量。
(注意:全局變量纔算是程序的數據,局部變量不算程序的數據,只能算是函數的數據)
經過自己的代碼測試:
靜態局部變量未初始化和初始化爲0的變量存儲的地址是連續的
初始化爲不爲0的值的變量也是相互連續的
但上述兩種類型的變量之間的地址卻不是連續的,猜測靜態局部變量和全局變量一模一樣,
初始化爲非0的放在.data段,未初始化和初始化爲0的存放在bss段。


2、有些特殊數據會被放到代碼段
(1)C語言中使用char *p = "linux";定義字符串時,字符串"linux"實際被分配在代碼段,
也就是說這個"linux"字符串實際上是一個常量字符串而不是變量字符串。
(2)const型常量:C語言中const關鍵字用來定義常量,常量就是不能被改變的量。const的實現方法至少有2種:
第一種就是編譯將const修飾的變量放在代碼段去以實現不能修改(普遍見於各種單片機的編譯器)
第二種就是由編譯器來檢查以確保const型的常量不會被修改,實際上const型的常量還是和普通變量一樣放在數據段的(gcc中就是這樣實現的)。


3、指向字符串的指針和字符串本身是分開的兩個東西
char *p = "linux";在這段代碼中,p本質上是一個字符指針,佔4字節,
"linux"分配在代碼段,佔6個字節;實際上總共耗費了10個字節,
這10個字節中:4字節的指針p叫做字符串指針(用來指向字符串的,理解爲字符串的引子,但是它本身不是字符串),
5字節的用來存linux這5個字符的內存纔是真正的字符串,
最後一個用來存'\0'的內存是字符串結尾標誌(本質上也不屬於字符串)。


測試:
(1)char *p = "linux"; sizeof(p)得到的永遠是4,因爲這時候sizeof測的是字符指針p本身的長度,和字符串的長度是無關的。
(2)strlen剛好用來計算字符串的長度(這個函數用來測字符數組沒有意義)。
發佈了49 篇原創文章 · 獲贊 14 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章