取消引用void *指针,结构数组

时间:2017-11-02 21:19:27

标签: c

我正在尝试将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

1 个答案:

答案 0 :(得分:2)

如上所述,您不应该在此处投射malloc()的结果:

hashtable = (struct bucket)malloc(6*sizeof(struct bucket));

将其修剪为:

hashtable = malloc(6*sizeof(struct bucket));

至于你的任务:

*(struct bucket)hashtable[0]->a = 12;
  1. 您的程序首先尝试计算hashtable[0]->a,但这会为您提供编译器警告,因为您还没有hashtable []和{{1}比铸造更高precedence

  2. 您需要转为->,因为struct bucket *是指针。

  3. 您尝试多次取消引用hashtable;您不需要额外的hashtable*运营商。

  4. 考虑到这一点,您可以访问->的{​​{1}}第一个元素,如下所示:

    a

    当然,您可以更轻松地定义hashtable,以避免每次要使用时((struct bucket *)hashtable)[0].a = 12;