我有两个结构:

typedef struct abc {
  unsigned int pref;
  unsigned int port;
  char *aRecordIp;
    int index;
    int count;
}abc_t;

typedef struct xyz {
        abc_t *ab;
        int index;
        int count;
}xyz_t;


我想实现以下目标

int Lookup (char *lookup,void *handle) {

*handle = (xyz_t *)malloc(sizeof(xyz_t *));
handle->ab = (abc_t *) malloc(sizeof(abc_t *));
//

}


我正在尝试将void指针类型转换为xyz_t。

它是否正确?

最佳答案

您在多个方面做错了:


您正在尝试设置变量handle->ab,但是handlevoid *,而不是结构类型指针。
您需要显示呼叫,但可能会出现问题-为什么您认为void *参数是个好主意?
您要分配结构,因此sizeof()操作数应为xyz_t而不是xyz_t *;重复abc_t


您可能应该使用:

int Lookup(const char *lookup, xyz_t **handle)
{
    ...
    *handle = (xyz_t *)malloc(sizeof(xyz_t));
    (*handle)->ab = (abc_t *)malloc(sizeof(abc_t));
    ...
}


不要忘记检查malloc()的结果。

有些人会因为在malloc()上使用强制转换而对您进行谴责。我不会当我学习C(很久以前,就没有C标准的几年)时,在一台机器上,地址的int *值与同一内存位置的char *地址的位模式不同。必须将malloc()声明为char *malloc(),否则所有地狱都会崩溃,必须进行强制转换。但是,这是人们所关注的主要问题,使用编译器选项进行编译非常关键,这样,如果您在范围内调用没有原型的函数,则会收到编译错误或警告您付款注意。令人担心的是,如果您在范围内没有malloc()的声明,则使用强制转换会得到不正确的结果,而编译器会诊断是否正确。

不过,总的来说,我认为您应该将查找代码与“创建xyz_t”代码分开-您的函数执行两项工作,并且使函数接口复杂化。

xyz_t *Create_xyz(void);
int Lookup(const char *lookup, const xyz_t *handle);

关于c - 类型转换void指针并分配内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18729151/

10-15 01:22
查看更多