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

时间:2018-01-23 18:11:37

标签: c arrays

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

案例2:char* s= "hello world";将其置于只读存储器中。

所以我的问题是为什么

char s[][6]={"Hello","world"};
s[1]="lucky"; //is illegal

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

2 个答案:

答案 0 :(得分:8)

s[1]="lucky"; //is illegal

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

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

来自标准:6.7.9.p14

  

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

如果您需要复制字符串,则必须使用strcpymemcpy等。

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

答案 1 :(得分:-3)

简单的答案是'C'并没有为程序员提供那么多的奢侈。 C中的赋值运算符仅从右手侧到左手侧复制特定类型,例如, intcharstruct等等,因此您可以=使用char运算符,但不能char*char[][6]使用=运算符等

其他编程语言,例如C ++可以提供这样的奢侈,因为你可以重载<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" > <LinearLayout android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="vertical"> <TextView android:id="@+id/tv_list_repo_name" android:text="@string/repo_name" android:textStyle="bold" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_item_repo_description" android:text="@string/description" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_gravity="center_vertical"> <TextView android:id="@+id/tv_item_forks" android:layout_width="match_parent" android:layout_height="wrap_content" android:drawableStart="@drawable/ic_fork" android:text="10" android:gravity="end"/> <TextView android:id="@+id/tv_item_stars" android:layout_width="match_parent" android:layout_height="wrap_content" android:drawableStart="@drawable/ic_star" android:gravity="end" android:text="14,000" /> </LinearLayout> </LinearLayout> - 运算符。有些编程语言默认支持这种操作,例如JavaScript的。我希望它能澄清你的怀疑。