1. 程式人生 > >2018-5-25字串常量與字串變數

2018-5-25字串常量與字串變數

/*本質上我是不想搞清楚這些奇奇怪怪的東西的,都是奇奇怪怪東西 0-0 -__-*/

下面是來自各個地方關於這個解釋,大家瞅著那個看上去比較合理就接受那一個吧,突然感覺陣列和指標是不一樣的。

char *s1="helloworld";

char s2[]="helloworld";

首先s1[0]='t';這是不對的啦,s1裡的內容是不能修改的。然後s2[0]='t'是可以的,s2裡的內容可以修改。修改下程式碼完全是合法的,編譯器不會抱錯,但程式執行會segmentation fault,因為.rodata和.text一樣是作業系統保護只讀的。這就是標準中所說的未定義行為。實際中大部分作業系統(沒有測試過)應該都會按照記憶體越權訪問處理。

First statement :常量就是固定不變的量,不能通過函式進行修改的變數;變數是可以通過賦值,函式等手段進行修改的一個變數。



字串常量:char *a = "hello world";首先,作業系統在編譯器規劃記憶體方案中的的文字常量區分配一段記憶體,儲存"hello world"字串,然後在棧區分配一個記憶體,儲存"hello world"字串所在記憶體的首地址,字串常量一旦分配是不允許修改的。

字元常量:char b[] = "hello world";作業系統在編譯器規劃的記憶體方案中的棧區分配一段連續記憶體空間(12個位元組),儲存"hello world"字串,
字串常量
就相當於字元的一個數組,是可以修改的。
字串常量:char *a = "hello world";首先,作業系統在編譯器規劃記憶體方案中的的文字常量區分配一段記憶體,儲存"hello world"字串,然後在棧區分配一個記憶體,儲存"hello world"字串所在記憶體的首地址,字串常量一旦分配是不允許修改的。 字元常量:char b[] = "hello world";作業系統在編譯器規劃的記憶體方案中的棧區分配一段連續記憶體空間(12個位元組),儲存"hello world"字串,字串常量就相當於字元的一個數組,是可以修改的。
<strong><em><u>secound statement: 字串指標變數本身是一個變數,用於存放字串的首地址。而字串本身是存放在以該首地址為首的一塊連續的記憶體空間中並以‘\0’作為串的結束。字元陣列是由於若干個陣列元素組成的,它可用來存放整個字串。【我覺得這個解釋比較正常的樣子】</u></em></strong>

third statement:字串變數是存放字串常量的變數,其取值是字串常量,即字串。


字串常量是用雙引號括起來的一個字串。

char s="s";
s就是字串變數,"s"就是字串常量。【這個解釋也很正常的樣子】字串常量是用雙引號括起來的一個字串。

char s="s";
s就是字串變數,"s"就是字串常量。【這個解釋也很正常的樣子】

繼續尋找滿意的答案。。。

int i=1;這裡的1也算常量,為什麼不放在.rodata區(常量區)呢,

這是因為編譯器認為普通的整型、浮點型或字元型常量在使用的時候是可以通過立即數來實現的,沒有必要額外儲存到資料區,如此節省了儲存空間和執行時的訪問時間。那麼什麼樣的資料才將放入常量區呢?【此處需要看彙編了,我看了半天就看明白了push %rbp :)】複雜的問題繼續尋求答案……

字串常量:不能對值修改。  常量:char *str = "abcdef"、"\n"

字串變數:能對值修改 。    變數:char c = "a"、char arr[] = "abc"

記住結論吧,溜了,,,,,說明彙編很重要啊 暫時不研究這個玩意了,很想把c語言發明者找來修改下這些奇奇怪怪規則但是 好像已經仙去了。

------------------還是沒有明白 明白了一點點,看到下面的話又不明白了

char *s1 的 s1 是指標,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。
char s2[] 的 s2 是陣列,對應著一塊記憶體區域,其地址和容量在生命期裡不會改變,只有陣列的內容可以改變。