關於c語言字串常量不可修改,起初誤認為是編譯器
把這樣的**
char *s=""
str";
優化成了
const char*="str".
const屬性也去不了。
但是實際上是與常量字串的記憶體體現有關。bodata段
bss段:
bss段(bsssegment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文blockstarted by symbol的簡稱。bss段屬於靜態記憶體分配。
data段:
資料段(datasegment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。
text段:
**段(codesegment/textsegment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀,某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。
rodata段:
存放c中的字串和#define定義的常量
heap堆:
堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)
stack棧:
是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。
以下摘自:
c語言目前有兩個主要標準c89和c99。這兩個標準中對字串常量的定義類似。要點:
型別是char (原因不明,沒有看到過權威解釋,估計是歷史遺留。)
連續儲存,末尾自動新增\0
靜態儲存
相同值常量的位址可以不同
修改字元是未定義行為
因為.rodata和.text一樣是作業系統保護唯讀的。這就是標準中所說的未定義行為。實際中大部分作業系統(沒有測試過)應該都會按照記憶體越權訪問處理。
這樣做的好處並不明顯。理論上fork的時候可以不拷貝.rodata,但主流的fork都實現了copy-on-write,效能上應該差別不大了。其他的好處也不大。
簡單來說,這樣做既沒有什麼明顯的好處,也沒有太大的壞處,很可能只是dennis ritchie et al拍腦袋的乙個決定,原因可能就是沒有原因。考慮到c並不是乙個精心設計的語言,這種小問題並不少見。例如史上最昂貴的乙個位元組的錯誤(the most expensive one-byte mistake)。可惜dr老大已故去,恐怕無從考證了。
c語言字元常量和字串常量 C語言中的字元常量
c語言字元常量和字串常量 any character a single character that is enclosed within the single quotes like,a is calledcharacter constants in c programming language....
C語言的字元陣列,字串,字串常量
首先來看一段源 include int main 剩餘部分為 0 char brr 不是字串,因為沒有 0 char crr 10 字元陣列特有 char drr 10 abc 字元陣列特有 char err abc 字元陣列特有 char frr 10 printf s n arr printf ...
嗨嘍C語言 字串常量
1.字串常量的概念和字串長度 字串常量是用一對雙引號括起來的若干字串行。字串中字元的個數稱為字串長度。長度為0的字串 即乙個字元都沒有的字串 稱為空串,表示為 一對緊連的雙引號 例如,how do you do.good morning.等,都是字串常量,其長度分別為14和13 空格也是乙個字元 如...