数组类型 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,而没有确定需要下载和安装外部库的位置/什么来访问它,这与面向未来的做法相反。 @DavidBandel strcpy 是一个标准的 C 函数。这绝对不是“第 3 方”。 添加这一行以使用 strcpy #include【参考方案2】:

TL;DR 回答:数组name 不是 可修改的左值。因此,您不能在其上使用赋值运算符 (=)。

要将内容复制到数组中,您需要使用strcpy() from string.hchar 数组)或memcpy()


现在,详细说明错误消息背后的实际原因,引用 C11,第 §6.5.16 章,Assignment operators

赋值运算符应该有一个可修改的左值作为其左操作数。

然后,引用同一标准中的第 6.3.2.1 章,

可修改的左值是没有数组类型的左值,[....]

因此,数组名称不是可修改的左值,因此,您不能为它分配任何东西。这就是错误消息背后的原因。

【讨论】:

但我想知道为什么 C 规范是这样定义的?想要从一个数组分配给另一个数组似乎是合理的...... @nielsbot 我能想到两个相关的原因 - 1)C 中没有运算符重载 2)数组名称,在大多数情况下(包括用作操作数时)衰减到指向第一个元素的指针赋值运算符) - 所以没有直接的方法来复制内容。最多可以使用地址 - 但这不是我们在这里寻找的用例。【参考方案3】:

= 运算符不能用于将一个数组的内容复制到另一个数组;您必须使用库函数,如 strcpystrcat 用于字符串,memcpy 用于非字符串(或单独分配数组元素)。

这是 C 如何处理数组表达式的结果。数组表达式被语言标准定义为不可修改的左值;它是一个左值,因为它引用内存中的一个对象,但它可能不是赋值的目标。

数组下标操作a[i]定义为*(a + i);也就是说,给定数组 address a,从该地址偏移 i 元素并取消引用结果。由于数组表达式a 被视为指针,大多数人认为a 变量存储 指向数组第一个元素的指针,但事实并非如此。所有存储的都是数组元素本身。

相反,每当编译器在语句中看到数组表达式时,它该表达式从“T 的 N 元素数组”类型转换为“指向 T 的指针”,然后表达式的值成为数组第一个元素的地址(除非表达式是 sizeof 或一元 &amp; 运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字)。

这就是为什么像word 这样的数组表达式不能成为赋值的目标;没有什么可以分配给 。没有对象word 独立于word[0]word[1] 等而存在。

当你写作时

word = "Jump";

表达式"Jump"的类型由“char的5元素数组”转换为“指向char的指针”,表达式的值是数组第一个元素的地址。而且您正在尝试将该 pointer 值分配给 array 对象,a) 不是指针,并且 b) 无论如何都不能分配给该对象。

【讨论】:

【参考方案4】:

使用来自&lt;string.h&gt;strcpy-

 strcpy(word,"Jump");

其余的也类似。

你不能这样做word ="Jump"。由于内容是可修改的,数组本身是不可修改的。

【讨论】:

以上是关于数组类型 char[] 不可分配 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

字符类型指针内存分配? [重复]

将'\'分配给char [重复]

一些分配和初始化数组的方法比普通的循环和设置更快[重复]

将字符串文字分配给 char* [重复]

java.lang.ArrayStoreException:将不正确类型的值分配给 Object [] 数组时 [重复]

从函数返回 char[]/string [重复]