C語言常量字串

2021-08-10 13:20:49 字數 1494 閱讀 3219

關於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 空格也是乙個字元 如...