如何从 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;
我有一个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;