我尝试将自构建类型数组分配给NULL时,遇到了一个不兼容的类型错误。这是我的代码:
#include <stdio.h>
#incldue <stdlib.h>
typedef struct {
int i;
double j;
} MyStruct;
int main() {
MyStruct array[10];
... //doing something
*array = NULL;
return 0;
}
我在Ubuntu上使用:
对其进行了编译 gcc -o main main.c
编译器显示以下错误:
error: incompatible types when assigning to type 'MyStruct {aka struct <anonymous>}' from type 'void *'
*array = NULL;
^
如何将数组分配给null?
我知道阵列和指针是不同的,在大多数情况下,数组名称转换为指针。(正如这个问题所解释的那样:数组名称是指针吗?)但是,当我的程序涉及自我结构的结构时,情况有所不同。
我尝试了以下两件事:
// 1st
int main() {
int array[10];
... //doing something
*array = NULL; // this gives a warning!!!
return 0;
}
上面的代码仅在编译时警告,而下面的代码有错误。
// 2nd
int main() {
MyStruck array[10];
... //doing something
*array = NULL; // this gives an Error!!!
return 0;
}
我也想知道是什么与众不同。
如何将数组分配给null?
您无法将数组分配给NULL
。阵列不是指针。这是一个不可修道的L值,不能保留分配操作员的操作数。
您在语句*array = NULL;
中所做的工作等效于array[0] = NULL;
。array[0]
是MyStruct
类型的,而NULL
用于分配指针类型,这使得分配运算符的操作数不兼容。
如果您试图将数组的所有元素设置为 0
,则可以做
MyStruct array[10] = {0};
*array
产生一个MyStruct
类型(非点),该类型不应该与指针类型NULL
兼容。作业无效。
也就是说,阵列不可分配。他们不是分配运营商的有效LHS操作数。您可以分配数组的各个元素,而不是数组(如数组变量名称)本身。
引用C11
,第§6.5.16章
分配运营商应在其左操作数时具有可修改的lvalue。
然后,第6.3.2.1章
[...]可修改的lvalue是一个lvalue 没有数组类型,没有不完整的类型,没有const符合条件 类型,如果是结构或工会,则没有任何成员(包括, 递归地,所有包含的骨料或工会的任何成员或元素)具有合格的 类型。