【发布时间】:2020-05-07 10:06:57
【问题描述】:
我知道类似的问题,例如this question,已在此处发布和回答,但这些答案并没有为我提供完整的图片,因此我将其作为一个新问题发布。希望没关系。
看下面的sn-ps-
char s[9] = "foobar"; //ok
s[1] = 'z' //also ok
和
char s[9];
s = "foobar" //doesn't work. Why?
但请看以下案例-
char *s = "foobar"; //works
s[1] = 'z'; //doesn't work
char *s;
s = "foobar"; //unlike arrays, works here
这有点令人困惑。我的意思是我有模糊的理解,我们不能为数组赋值。但是我们可以修改它。对于char *s,似乎我们可以赋值但不能修改它,因为它是写在只读存储器中的。但我仍然无法获得全貌。
底层到底发生了什么?
【问题讨论】:
-
如果可能的话......想象一下
char s[9]; s = "123"; s[0] = 'a';。 -
想象一下,对于每个字符串文字(例如
"foobar"),编译器会自动将const char string_literal_001[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'};之类的定义放在其他地方,而您实际上所做的是s = string_literal_001;简单赋值或strcpy(s, string_literal_001)进行初始化。
标签: c arrays string pointers char