c - 如何从 struct 初始化 void* 指针

标签 c struct void-pointers

我有一个结构元素。当我尝试将元素数组初始化为 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 结构中名为 data 的命名字段

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

第三,因为您使用了calloc,内存已经被“初始化”为全零位模式(包括您的数据 文件)。形式上,void * 中的这种位模式不能保证表示空指针,但在大多数平台上确实如此。

附言不要转换 calloc

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

或事件更好

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

关于c - 如何从 struct 初始化 void* 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32021596/

相关文章:

C:无法访问结构中字符串数组中的元素

c - 为什么 memcmp 返回 -1 虽然相等

c - 结构的 Malloc'ing 指针到指针成员

c - 临时为算术转换 void* 的正确方法是什么?

c - Malloc 和 Void 指针

在C语言的Arm RVCT编译器上将double转换为int

c - 当我尝试构建时,Eclipse CDT 不使用我的 Makefile。

c - 如何在 C 中为 GTK+ 应用程序设置固定的窗口大小?

c - 如何优化 a[i] = -b[i] * (c[i] + d);

c - 为什么我不能访问这个 void 类型数组的第二个元素