案例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]。
我已经阅读了很多答案,所有人都在说明有什么区别,但没有人说出原因?请解释,因为我是初学者。
答案 0 :(得分:8)
s[1]="lucky"; //is illegal
因为数组名称不是可修改的左值。详细点因此它们不能出现在赋值的左侧。
初始化不是分配。正是在初始化期间,当字符串文字不会衰减成指针时,而文字的值被复制到内存中,这允许我们修改它的内容。 (你展示的第一个就是一个例子)。
来自标准:6.7.9.p14
字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选择用大括号括起来。字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。
如果您需要复制字符串,则必须使用strcpy
,memcpy
等。
详细点:很好地说 - 赋值表达式的左侧是少数几个上下文,其中数组类型的表达式不会衰减到指针,并且数组类型的表达式还不是可修改的左值。 (C2011 6.3.2.1/1-2)因此,出现在赋值表达式的LHS上的s[1]
不是可修改的lvalue
。 John Bollinger 对此进行了评论。
答案 1 :(得分:-3)
简单的答案是'C'并没有为程序员提供那么多的奢侈。 C中的赋值运算符仅从右手侧到左手侧复制特定类型,例如, int
,char
,struct
等等,因此您可以=
使用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的。我希望它能澄清你的怀疑。