以下代码中的表达式语法错误

时间:2019-09-17 07:09:19

标签: c

char name[25]; 
name[] = "abcd";

上面的代码给了我表达式语法错误。

char name[25]; 
name = "abcd";

上面的代码给了我一个Lvalue Required错误。

但是以下代码没有错误:

char name[25] = "abcd";

有人可以解释吗?

2 个答案:

答案 0 :(得分:3)

char name[25](数组的声明)执行此操作:

  • 保留25个字节的内存
  • name声明为指向该内存的字符数组(几乎但并不完全类似于char *)。

char name[25] = "abcd"(带有初始化程序的数组的声明)执行此操作:

  • 保留25个字节的内存,其中充满"abcd\0"
  • name声明为指向该内存的字符数组(几乎但并不完全类似于char *)。

name[] = "abcd"的情况不是C支持的语法。)

在这两种情况下,指针和数组之间的关键区别之一是指针的目标可以更改。数组的目标不能。即您永远不能为上面声明为name的{​​{1}}分配任何内容,但是可以按照以下方式分配给声明为char[]的{​​{1}}。 name(指针的声明,将文字字符数组分配给指针)执行以下操作:

  • 保留5个字节的内存,由char *
  • 填充
  • char *name; name = "abcd"声明为指向未定义目标的字符(几乎但不完全类似于"abcd\0")的指针
  • name占用的内存地址分配给变量char[]

答案 1 :(得分:3)

如果根据需要放置分号,则此构造

char name[25]; name[]="abcd";

可能会被重写以提高可见性,例如

char name[25]; 
name[]="abcd";

所以我看到在第二行中我们没有类型说明符,该行将是有效的声明

char name[25]; 
char name[]="abcd";

在这一行中,再次缺少第二个标识符的类型说明符

char name[25]; name ="abcd"

我们将像这样重写

char name[25]; 
char name ="abcd";

然后name的类型为char,但它是由字符串文字而不是一个字符初始化的。因此很明显name应该是一个数组或一个指向char的指针,例如

char name[25]; 
char name[] ="abcd";

char name[25]; 
char *name ="abcd";

或者例如

char name[25]; 
char name[26] ="abcd";

当然,标识符的名称应该不同。否则,由于在相同范围内重新定义了相同的标识符名称,编译器将再次发出错误。