分配结构字段时,“错误:赋值给表达式,数组类型错误”(C)
我是初学C程序员,昨天我学习了C结构的使用以及这些结构可能应用于特定问题的解决方案。 然而,当我尝试使用我的C IDE(Codeblocks 16.01)来学习C编程的这个方面时,我遇到了一个奇怪的问题。 代码如下:
#include #define N 30 typedef struct{ char name[N]; char surname[N]; int age; } data; int main() { data s1; s1.name="Paolo"; s1.surname = "Rossi"; s1.age = 19; getchar(); return 0; }
在编译期间,编译器(Windows下的GCC 4.9.3-1)向我报告了一个错误
“错误:赋值给表达式,数组类型错误”
在指导上
s1.name="Paolo" s1.surname="Rossi"
如果我这样做的话
data s1 = {"Paolo", "Rossi", 19};
有用。 我究竟做错了什么?
你正面临着问题
s1.name="Paolo";
因为,在LHS中,您使用的数组类型不可分配 。
详见C11
,第6.5.6章
赋值运算符应具有可修改的左值作为其左操作数。
并且,关于可修改的左值 ,来自章节§6.3.2.1
可修改的左值是一个没有数组类型的左值,[…]
您需要使用strcpy()
复制到数组中。
也就是说, data s1 = {"Paolo", "Rossi", 19};
工作正常,因为这不是涉及赋值运算符的直接赋值 。 我们使用括号括起的初始化列表来提供对象的初始值。 这遵循初始化定律,如章节§6.7.9中所述
每个大括号括起的初始化列表都有一个关联的当前对象。 当没有指定时,根据当前对象的类型按顺序初始化当前对象的子对象:增加下标顺序的数组元素,声明顺序中的结构成员,以及union的第一个命名成员。[… ]
请在此处查看此示例: 访问结构成员
有人解释说正确的方法是这样的:
strcpy(s1.name , "Egzona"); printf( "Name : %s\n", s1.name);
typedef struct{ char name[30]; char surname[30]; int age; } data;
定义data
应该是一个内存块,适合60个字符加上4个用于int *
[----------------------------,------------------------------,----] ^ this is name ^ this is surname ^ this is age
这会在堆栈上分配内存。
data s1;
作业只是复制数字,有时是指针。
这失败了
s1.name = "Paulo";
因为编译器知道s1.name
是64字节长的结构的开头,而"Paulo"
是一个6字节长的char [](因为C字符串中的尾随\ 0是6)
因此,尝试将指向字符串的指针分配给字符串。
将“Paulo”复制到点name
的结构中,将“Rossi”复制到点surname
的结构中。
memcpy(s1.name, "Paulo", 6); memcpy(s1.surname, "Rossi", 6); s1.age = 1;
你结束了
[Paulo0----------------------,Rossi0-------------------------,0001]
strcpy
做同样的事情,但它知道\0
终止所以不需要硬编码的长度。
或者,您可以定义一个指向任何长度的char数组的结构。
typedef struct { char *name; char *surname; int age; } data;
这将创造
[----,----,----]
现在这将有效,因为您使用指针填充结构。
s1.name = "Paulo"; s1.surname = "Rossi"; s1.age = 1;
像这样的东西
[---4,--10,---1]
其中4和10是指针。
*注意,整数和指针可以是不同的大小,上面的大小4是32位作为示例。