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。有一个微妙的区别。 –