如何从 struct 初始化 void* 指针

How to initialize an void* pointer from struct

我有一个struct Element。当我尝试将元素数组初始化为 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++) {
        /*
         * error: incompatible types when assigning to type 
         * ‘Element’ from type ‘void *’
         */
        list->elements[i] = NULL;
    }
}

首先,您从未为 list 对象分配内存!您的 list 指针未初始化且指向任何地方。尝试对其应用 -> 运算符会导致未定义的行为。

我不知道你的最终意图是什么,但应该是这样的

ArrayList *list = malloc(sizeof *list);
list->size = 100;
...

ArrayList list;
list.size = 100;
...

其次,您的 void * 指针实际上是 Element struct

中名为 data 的命名字段
for(i = 0; i < list->size; i++)
    list->elements[i].data = NULL; 

第三,因为你使用了 calloc 内存已经是 "initialized" 全零位模式(包括你的 data 字段)。形式上,void * 中的这种位模式不能保证表示空指针,但在大多数平台上确实如此。

P.S。不要转换 calloc

的结果
 list->elements = calloc(sizeof(Element), list->size);

或事件更好

 list->elements = calloc(sizeof *list->elements, list->size);

除了所有逻辑错误之外,编译器错误是由于尝试将值 (NULL) 分配给结构类型变量而导致的。该结构包含 void * 的事实纯属巧合。你会得到同样的错误:

typedef struct _Element Element;
struct _Element{
    int data;
};

Element e;
e = NULL;

这很可能是您打算做的错误,它是为变量 inside 结构赋值:

for(i = 0; i < list->size; i++)
        list->elements[i].data = NULL;