可能重複:
Why do I get a segmentation fault when writing to a string?爲什麼這個程序沒有給出預期的輸出?
int main()
{
char *c = "abc";
*c = 'd';
printf("%s",c);
return 0;
}
當我試圖運行這個程序在C,那麼crashes..I想知道什麼是錯誤這裏的程序?
可能重複:
Why do I get a segmentation fault when writing to a string?爲什麼這個程序沒有給出預期的輸出?
int main()
{
char *c = "abc";
*c = 'd';
printf("%s",c);
return 0;
}
當我試圖運行這個程序在C,那麼crashes..I想知道什麼是錯誤這裏的程序?
因爲字符串文字abc
實際上存儲在進程的只讀區域中,所以不應該修改它。操作系統已將相應的頁面標記爲只讀,並且您在嘗試寫入時遇到運行時異常。
每當你一個字符串分配給char
指針,始終有資格作爲const
使編譯器警告你這樣的問題:
const char *c = "abc";
*c = 'd'; // the compiler will complain
如果你真的想修改一個字符串(雖然不能直接本身,而是它的拷貝),我會建議使用strdup
:
char *c = strdup("abc");
*c = 'd'; // c is a copy of the literal and is stored on the heap
...
free(c);
「char *'指針」將是一個char **。 –
@Samuel:正確:-) –
是一個字符串文字。
*c = 'd'
是嘗試修改該字符串文字。
您不能修改字符串文字。
請注意,在某些平臺上,您可以修改字符串文字。 –
@WilliamPursell:試圖修改字符串文字會導致未定義的行爲。即使它不會在某個平臺上崩潰,也會導致其他錯誤(例如更改不同的字符串)。 – interjay
@WilliamPursell:如果你想讓你的程序展現出定義好的行爲,你就不能這樣做。 –
'C'指向一個字符串文字而這又不可修改的。但你想改變的人物之一。 –
如果你想知道,'char c [4] =「abc」;'會起作用。 –