嗨,我有一个struct Element。当我尝试将elements数组初始化为NULL时。 我收到错误:从类型'void 中分配类型'Element'时出现不兼容的类型。 任何人都知道如何初始化void 数组?感谢。
typedef struct _Element Element;
struct _Element{
void* data;
};
typedef struct _ArrayList ArrayList;
struct _ArrayList{
int size;
Element *elements;
};
int main()
{
ArrayList *list;
list->size = 100;
list->elements = (Element*)calloc(sizeof(Element), list->size);
for(i = 0; i < list->size; i++)
list->elements[i] = NULL; // error: error: incompatible types when assigning to type ‘Element’ from type ‘void *’
}
答案 0 :(得分:2)
首先,您从未为list
对象分配内存!您的list
指针未初始化并且无处可指。尝试将->
运算符应用于它会导致未定义的行为。
我不知道你最后的意图是什么,但它应该是
之类的东西ArrayList *list = malloc(sizeof *list);
list->size = 100;
...
或
ArrayList list;
list.size = 100;
...
其次,您的void *
指针实际上是data
struct
Element
的命名字段
for(i = 0; i < list->size; i++)
list->elements[i].data = NULL;
第三,是的,你使用calloc
内存已经被“初始化”为全零位模式(包括你的data
文件)。形式上,void *
中的这种位模式不能保证代表空指针,但在大多数平台上实际上都是这样。
P.S。不要投射calloc
list->elements = calloc(sizeof(Element), list->size);
或事件更好
list->elements = calloc(sizeof *list->elements, list->size);
答案 1 :(得分:0)
除了所有逻辑错误之外,编译器错误是尝试为结构类型变量赋值(NULL)的结果。结构包含void *
这一事实很巧合。你会得到同样的错误:
typedef struct _Element Element;
struct _Element{
int data;
};
Element e;
e = NULL;
这很可能是您打算做的错误,它会为结构 中的变量赋值:
for(i = 0; i < list->size; i++)
list->elements[i].data = NULL;