struct employee
{
char name[20];
}emp;
void main()
{
emp.name[20]="John";
printf("%s\n",emp.name);
}
为什么这段代码没有输出? 为什么不能直接初始化字符串数组?
答案 0 :(得分:4)
首先:您的编译器应警告您。如果您使用gcc
,请尝试使用
gcc -std=c11 -Wall -Wextra -pedantic
并看到。
问题是语法错误。您将字符串文字分配给emp.name[20]
emp.name
的第21个元素。此元素甚至不存在,并且类型为char
。
你想要的是:
emp.name = "John"; // <- INVALID!!
但是这不起作用,因为C很遗憾不允许将分配给数组。您可以使用函数strcpy
(字符串副本)来实现您想要的功能(包括string.h
):
strcpy(emp.name, "John");
答案 1 :(得分:2)
声明emp.name[20]="John";
有一些问题。目的似乎是将字符串"John"
分配给字符数组emp.name
。但是,您无法分配给字符数组(您可以初始化它们)。 "John"
是一个字符串文字,它在赋值表达式中衰减为指向char
数组的第一个元素的指针,因此该语句试图将指向char
的指针赋值给{ {1}},无论如何都不是字符数组,但它是emp.name[20]
,除了char
是一个尝试的越界数组访问。请记住,数组在C中是零索引的,因此数组的第一个元素是emp.name[20]
,最后一个索引是emp.name[0]
。最后,即使这个赋值是数组的有效元素,你也不一定要指向emp.name[19]
的指针。
一种解决方案是将char
设为emp
本地,并使用初始值设定项。请注意,main()
的函数签名应为main()
或int main(void)
之一;此处的任何其他函数签名都是依赖于实现的。另外,我假设原始代码不会忘记int main(int argc, char **argv)
。
#include <stdio.h>
或者,您可以在不更改#include <stdio.h>
struct employee
{
char name[20];
};
int main(void)
{
struct employee emp = { .name = "John" };
printf("%s\n",emp.name);
return 0;
}
的情况下使用strcpy()
。这种方法的一个缺点是你必须小心不要试图复制大于emp
的字符串:
emp.name[]
指定的初始值设定项也可以在原始#include <stdio.h>
#include <string.h>
struct employee
{
char name[20];
} emp;
int main(void)
{
strcpy(emp.name, "John");
printf("%s\n",emp.name);
return 0;
}
的文件范围内使用,如下所示:
struct
答案 2 :(得分:1)
Emp.name [20]取数组名称的第20位的索引。所以它会引发错误。 你可以用这种方式写你的代码 的strcpy()
#include <stdio.h>
#include<string.h>
struct employee
{
char name[20];
}emp;
void main()
{
// emp.name="John";
strcpy(emp.name,"john");
printf("%s\n",emp.name);
}