将一个字符数组分配给另一个给出错误。为什么?

时间:2016-03-10 15:24:25

标签: c arrays string pointers assignment-operator

数组的名称是指向第一个元素的指针。那么为什么一个字符数组不能分配另一个数组?

#include<stdio.h>
int main()
{
  char str1[]="Hello";
  char str2[10];
  char *s="Good Morning";
  char *q;
  str2=str1;  /* Error */
  q=s; /* Works */
  return 0;
}

2 个答案:

答案 0 :(得分:7)

首先,数组的名称与指向第一个元素的指针不一样。在某些情况下,数组名称会衰减到指向第一个元素的指针,但通常它们不相同。

在那里遇到问题,数组名称不是可修改的左值,因此无法分配它们。

C11 Lvalues,数组和函数指示符引用第6.3.2.1节

  

[...] 可修改的左值是一个左值   没有数组类型,没有不完整的类型,没有const限定   类型,如果是结构或联合,则没有任何成员(包括,   递归地,所有包含聚合或联合的成员或元素具有const限定   类型。

对于赋值运算符,LHS应该是可修改的左值。

引用C11,章节§6.5.16,

  

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

在你的情况下,

 str2=str1;

str2不是可修改的左值。因此,你得到了错误。

FWIW,要复制内容,您可以使用strcpy()头文件中的string.h

答案 1 :(得分:2)

表达式中的数组自动转换为指向数组第一个元素的指针,但sizeof运算符和一元&运算符的操作数除外,因此无法分配给数组。

#include <string.h>添加到代码的头部并使用strcpy()是复制字符串的好方法之一。

#include<stdio.h>
#include<string.h>
int main(void)
{
  char str1[]="Hello";
  char str2[10];
  char *s="Good Morning";
  char *q;
  strcpy(str2, str1);  /* Works */
  q=s; /* Works */
  return 0;
}