2016-02-13 33 views
-1

如果我想在不更改指針地址的情況下更改指向的值,我該怎麼辦?C,將一個指向的值賦給一個指向的值,比如* a = * b;

3,*d=*b將在運行時返回分段錯誤。我認爲這是因爲*d沒有指向任何內存空間。這也解釋了爲什麼2,工作。但是,對於1,*a*b指向相同大小的內存,爲什麼它會在這裏返回分段錯誤?

void main(void){ 
    char *a="abcd"; 
    char *b="1234"; 
    char *c=(char *)malloc(sizeof(char)); 
    char *d; 
    *a=*b; //1.segmentation fault 
    *c=*b; //2.ok 
    *d=*b; //3.segmentation fault 
} 
+3

您不能更改字符串文字。任何嘗試修改它們都會導致未定義的行爲。此代碼無法工作。 –

+2

可能的重複[爲什麼在寫入以「char \ * s」初始化但不是「char s \ [\]」的字符串時出現分段錯誤?](http://stackoverflow.com/questions/164194/爲什麼要做,我得到一個分割錯誤,當寫入字符串初始化與cha),http://stackoverflow.com/questions/10202013/change-string-literal-in -c-through-pointer,http://stackoverflow.com/questions/1011455/is-it-possible-to-modify-a-string-of-char-in-c/1011481,http://stackoverflow.com/questions/480555/modify-c-string-constants –

回答

1

這是因爲字符串,如"abcd"是C.不變這是不確定的行爲,試圖修改之一。

如果你希望字符串被修改,你必須聲明它是這樣的:

char a[] = "abcd"; 

這將宣告一個本地數組與字符串的內容初始化它(這是從聲明不同指向字符串的指針)

+0

那麼如果我想複製並創建一個新的字符串並使其成爲'a'指向呢? – sunjiayang

+0

然後數組方法(上面)不是你應該選擇的那個。 –

2

常量字符串通常存儲在只讀存儲器中,您不能修改它們。

爲了讓他們寫的先創建一個副本:

char *a = strdup("abcd"); 
相關問題