我正在尝试将void *指针更改为结构数组。 关键是要将全局可见指针初始化为NULL,当主要启动时,将转换为结构数组 这是一个最小的例子。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void * hashtable;
struct bucket {
int a;
int b;
};
int main (void)
{
hashtable = (struct bucket)malloc(6*sizeof(struct bucket));
int i ;
//for(i=0;i<6;i++)
// hashtable[i] = malloc(sizeof(struct bucket));
*(struct bucket)hashtable[0]->a = 12;
return 0;
}
我得到的错误是:
test.c:16:52: error: conversion to non-scalar type requested
hashtable = (struct bucket)malloc(6*sizeof(struct bucket));
^
test.c:21:27: warning: dereferencing ‘void *’ pointer
*(struct bucket)hashtable[0]->a = 12;
^
test.c:21:27: error: void value not ignored as it ought to be
答案 0 :(得分:2)
如上所述,您不应该在此处投射malloc()
的结果:
hashtable = (struct bucket)malloc(6*sizeof(struct bucket));
将其修剪为:
hashtable = malloc(6*sizeof(struct bucket));
至于你的任务:
*(struct bucket)hashtable[0]->a = 12;
您的程序首先尝试计算hashtable[0]->a
,但这会为您提供编译器警告,因为您还没有hashtable
[]
和{{1}比铸造更高precedence。
您需要转为->
,因为struct bucket *
是指针。
您尝试多次取消引用hashtable
;您不需要额外的hashtable
和*
运营商。
考虑到这一点,您可以访问->
的{{1}}第一个元素,如下所示:
a
当然,您可以更轻松地定义hashtable
,以避免每次要使用时((struct bucket *)hashtable)[0].a = 12;
。