如何从Struct初始化void *指针

时间:2015-08-15 04:43:30

标签: c struct

嗨,我有一个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 *’
}

2 个答案:

答案 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;