数组类型char 不可分配
那么这是我的第一篇文章。 我一直在尝试做这个选择选择的东西,我希望用户只选择数字而不是键入它们(更容易)但是当我希望数字等于一个字符串时,它说“数组类型char[30]
不是分配”。 即使在后面我也放了分号。
#include int main() { int choice1; char word[30]; printf("You have three choice.\n"); printf("[1] Jump [2] Run [3] Dance\n"); scanf("%d",&choice1); if (choice1 == 1) { word = "Jump" //Error #1 } else if (choice1 == 2) { word = "Eat" //Error #2 } else if (choice1 == 3) { word = "Sleep"; //Error #3 } printf("You will now be %sing",word); }
您不能分配给数组,只能复制到它。
请改用strcpy
strcpy(word, "Jump");
TL; DR回答:数组名称 不是可修改的左值。 因此,您不能使用赋值运算符( =
)。
要将内容复制到数组中,通常需要使用string.h
( char
数组)或memcpy()
中的strcpy()
。
现在,详细说明错误消息背后的实际原因 ,引用C11
,章节§6.5.16, Assignment operators
赋值运算符应具有可修改的左值作为其左操作数。
然后,引用相同标准的第6.3.2.1章,
可修改的左值是一个没有数组类型的左值,[….]
因此,数组名称不是可修改的左值,因此,您无法为其分配任何内容。 这是错误消息背后的原因。
=
运算符不能用于将一个数组的内容复制到另一个数组; 你必须使用像strcpy
或strcat
这样的库函数用于字符串, memcpy
用于非字符串(或单独分配数组元素)。
这是C处理数组表达式的结果 。 数组表达式由语言标准定义为不可修改的左值 ; 它是一个左值,因为它引用了内存中的一个对象,但它可能不是赋值的目标。
数组下标操作a[i]
定义为*(a + i)
; 也就是说,给定数组地址 a
,从该地址偏移i
元素并取消引用结果。 由于数组表达式a
被视为指针,因此大多数人认为变量存储指向数组第一个元素的指针,但事实并非如此。 所有存储的都是数组元素本身。
相反,只要编译器在语句中看到数组表达式,它就会将该表达式从“N的元素数组T
”转换为“指向T
指针”,并且表达式的值将成为数组的第一个元素的地址(除非表达式是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字)。
这就是为什么像word
这样的数组表达式不能成为赋值的目标; 什么都没有分配给 。 不存在与word[0]
, word[1]
等无关的对象word
。
当你写作
word = "Jump";
表达式"Jump"
的类型从“5个元素的char
数组"Jump"
转换为“指向char
指针”,表达式的值是数组的第一个元素的地址。 并且您正在尝试将该指针值分配给数组对象,a)不是指针,并且b)无论如何都无法分配。
使用stcpy
–
strcpy(word,"Jump");
其余的类似。
你不能做word ="Jump"
。 由于内容是可修改的,因此数组本身不可修改。