PART 1這兩個字符串有什麼區別?
我有兩個字符串,它們將在後面的ways-
char s1[] = "foo";
char *s2 = "foo";
定義。當我試圖改變這些字符串,比如一個字符時,第2個字符 -
char s1[1] = 'x';
char s2[1] = 'x';
字符串中的字符s1
更改,但更改字符串s2
中的字符會給我出現此錯誤 - Segmentation fault (core dumped)
。
這是爲什麼?
爲什麼我無法更改以另一種方式定義的字符串的字符?
PART 2
字符串(?他們是字符數組,右)可以使用初始化 - char *s = "foo"
但爲什麼編譯器會發出警告,當我嘗試初始化使用不同類型的數組像int *arr = {1, 2, 3}
一樣的東西?
foo.c: In function ‘main’:
foo.c:5:5: warning: initialization makes pointer from integer without a cast [enabled by default]
foo.c:5:5: warning: (near initialization for ‘foo’) [enabled by default]
foo.c:5:5: warning: excess elements in scalar initializer [enabled by default]
foo.c:5:5: warning: (near initialization for ‘foo’) [enabled by default]
foo.c:5:5: warning: excess elements in scalar initializer [enabled by default]
foo.c:5:5: warning: (near initialization for ‘foo’) [enabled by default]
注:我的編譯器是GCC。
**'s1'是一個數組**(帶4個要素); **'s2'是一個指針**(指向具有4個元素的(不可修改)數組的第一個元素)。 「字符串」是其中一個元素是「\ 0」的數組。閱讀[comp.lang.c FAQ](http://c-faq.com/),從第6部分開始。 – pmg
@KingsIndian還有一個** PART 2 **。 – ShuklaSannidhya
@pmg它不必是「不可修改的」。只有修改它是UB。有一個微妙的區別。 –