数组类型 char[] 不可分配 [重复]
Posted
技术标签:
【中文标题】数组类型 char[] 不可分配 [重复]【英文标题】:Array type char[] is not assignable [duplicate] 【发布时间】:2015-11-25 14:24:33 【问题描述】:这是我的第一篇文章。我一直在尝试做这个选择,我希望用户只选择数字而不是输入它们(更容易)但是当我希望数字等于一个字符串时,它会说“数组类型char[30]
是不可分配的”。即使在后面我是否放分号。
#include <stdio.h>
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
的情况下分配给word
,你可以让word
输入const char *word
。
令人惊讶的是,您收到错误是因为数组类型 char[] 不可分配。在 C 中,你不能像你那样分配字符串,因为没有内置的字符串类型,只有原始字符数组。无论如何,这是一个常见问题解答......有人请找到一个副本。
“重复”中接受的答案不是答案 (meta.stackexchange.com/questions/225370/…),只是一个可怕的常见问题解答的链接。
【参考方案1】:
你不能赋值给一个数组,只能复制给它。
改用strcpy
,比如
strcpy(word, "Jump");
【讨论】:
建议一些 3rd 方库函数,如 strcpy,而没有确定需要下载和安装外部库的位置/什么来访问它,这与面向未来的做法相反。 @DavidBandelstrcpy
是一个标准的 C 函数。这绝对不是“第 3 方”。
添加这一行以使用 strcpy #includeTL;DR 回答:数组name 不是 可修改的左值。因此,您不能在其上使用赋值运算符 (=
)。
要将内容复制到数组中,您需要使用strcpy()
from string.h
(char
数组)或memcpy()
。
现在,详细说明错误消息背后的实际原因,引用 C11
,第 §6.5.16 章,Assignment operators
赋值运算符应该有一个可修改的左值作为其左操作数。
然后,引用同一标准中的第 6.3.2.1 章,
可修改的左值是没有数组类型的左值,[....]
因此,数组名称不是可修改的左值,因此,您不能为它分配任何东西。这就是错误消息背后的原因。
【讨论】:
但我想知道为什么 C 规范是这样定义的?想要从一个数组分配给另一个数组似乎是合理的...... @nielsbot 我能想到两个相关的原因 - 1)C 中没有运算符重载 2)数组名称,在大多数情况下(包括用作操作数时)衰减到指向第一个元素的指针赋值运算符) - 所以没有直接的方法来复制内容。最多可以使用地址 - 但这不是我们在这里寻找的用例。【参考方案3】:=
运算符不能用于将一个数组的内容复制到另一个数组;您必须使用库函数,如 strcpy
或 strcat
用于字符串,memcpy
用于非字符串(或单独分配数组元素)。
这是 C 如何处理数组表达式的结果。数组表达式被语言标准定义为不可修改的左值;它是一个左值,因为它引用内存中的一个对象,但它可能不是赋值的目标。
数组下标操作a[i]
定义为*(a + i)
;也就是说,给定数组 address a
,从该地址偏移 i
元素并取消引用结果。由于数组表达式a
被视为指针,大多数人认为a
变量存储 指向数组第一个元素的指针,但事实并非如此。所有存储的都是数组元素本身。
相反,每当编译器在语句中看到数组表达式时,它将该表达式从“T
的 N 元素数组”类型转换为“指向 T
的指针”,然后表达式的值成为数组第一个元素的地址(除非表达式是 sizeof
或一元 &
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字)。
这就是为什么像word
这样的数组表达式不能成为赋值的目标;没有什么可以分配给 。没有对象word
独立于word[0]
、word[1]
等而存在。
当你写作时
word = "Jump";
表达式"Jump"
的类型由“char
的5元素数组”转换为“指向char
的指针”,表达式的值是数组第一个元素的地址。而且您正在尝试将该 pointer 值分配给 array 对象,a) 不是指针,并且 b) 无论如何都不能分配给该对象。
【讨论】:
【参考方案4】:使用来自<string.h>
的strcpy
-
strcpy(word,"Jump");
其余的也类似。
你不能这样做word ="Jump"
。由于内容是可修改的,数组本身是不可修改的。
【讨论】:
以上是关于数组类型 char[] 不可分配 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.ArrayStoreException:将不正确类型的值分配给 Object [] 数组时 [重复]