为什么这个C字符串赋值是非法的?

Ash*_*gra 0 c arrays

情况1:char s[][6]={"Hello","world"}; 在这种情况下,静态数组被分配在只读存储器中,并从那里将元素复制到数组中.在案例2中.

情况2:char* s= "hello world";将它放在只读存储器中.

所以我的问题是为什么

char s[][6]={"Hello","world"};
s[1]="lucky"; //is illegal
Run Code Online (Sandbox Code Playgroud)

因为如果从只读内存复制元素,那么为什么s[1]="lucky";不能将此语句从只读内存复制到数组,因为还为此字符串文字分配了一个数组,并从那里将元素复制到s [1].我已经阅读了很多答案,所有人都在说明有什么区别,但没有人说出原因?请解释,因为我是初学者.

use*_*738 10

s[1]="lucky"; //is illegal
Run Code Online (Sandbox Code Playgroud)

因为数组名称不是可修改的左值.详细点因此,它们不能出现在作业的左侧.

初始化不是分配.正是在初始化期间,当字符串文字不会衰减成指针时,而文字的值被复制到内存中,这允许我们修改它的内容.(你展示的第一个就是这个例子).

从标准:6.7.9.p14

字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选地用大括号括起来.字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素.

如果你需要复制字符串,那么你将不得不使用strcpy,memcpy等等.

详细点:很好地说 - 赋值表达式的左侧是在少数几个上下文中,其中数组类型的表达式不会衰减到指针,并且数组类型的表达式还不是可修改的左值.(C2011 6.3.2.1/1-2)因此strcpy,在LHS中出现的赋值表达式不是可修改的memcpy.John Bollinger评论了这一点.