2014-11-04 38 views
2
#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    char str[]="somethingisbetterthannothing"; 
    memset(str,'-',6); 
    puts(str); 
    return 0; 
} 

我在執行該程序時期待分段錯誤。 但它印C程序試圖修改文本段中的位置

------ingisbetterthannothing 

這是否表明該字符串是不會存儲在只讀文本段?

+1

char str [] =「string」--->這是複製到堆棧,但char * ptr =「字符串」這是在RO部分 – 2014-11-04 03:56:56

回答

4
char str[]="somethingisbetterthannothing"; 

上述行中沒有字符串字面值。
只有一個char-陣列的初始值設定項。

char* str = "somethingisbetterthannothing"; 

這將是一個指向字符串文字的指針。
而且,當您嘗試修改字符串文字時,並不能保證會發生什麼。
這是字面上和明確的Undefined Behavior(順便說一句:在接受的答案的例子是修改字符串文字)。

+0

謝謝爲答案。我有這個問題:直到函數被執行,字符串「sometingisbetterthannothing」將被保存在程序文件中? – whitetiger 2014-11-04 04:01:49

+0

@whitetiger方便的地方。代碼,數據,只讀數據。對於如此長的初始化器,它可能會像字符串一樣處理。它甚至可以根據as-if規則進行優化。 – Deduplicator 2014-11-04 04:03:08

1

當字符串被聲明爲字符數組,它們被存儲像其他類型的陣列中C.

對於例如如果str []是一個自動可變然後字符串存儲在stack segment,如果它是一個全局或靜態然後存儲在data segment中。

使用字符指針串可被存儲在兩個方面:

--->只讀串中的共享段。 將字符串值直接分配給指針時,在大多數編譯器中,它存儲在函數之間共享的只讀塊(通常在數據段中)。

char *str = "vinay";

「維奈」 被存儲在共享read only location,但指針str存儲在read-write memory

- 使用malloc

如果你嘗試修改字符串文字或>動態分配由於RO部分的更改不允許,常量分段故障將會得到。但在你的情況下,你改變WR部分,即堆棧部分,所以obviuolsy沒有錯誤