类型转换void指针并分配内存

时间:2013-09-10 21:38:07

标签: c pointers structure

我有两种结构:

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 *));
//

}

我试图基本上对xyz_t的void指针进行类型转换。

这是对的吗?

4 个答案:

答案 0 :(得分:1)

你在多个方面做错了:

  1. 您正在尝试设置变量handle->ab,但handlevoid *,而不是结构类型指针。
  2. 你需要显示你的电话,但可能会有问题 - 为什么你认为void *论证是个好主意?
  3. 您想要分配结构,因此sizeof()个操作数应为xyz_t而不是xyz_t *;重复abc_t
  4. 您应该使用:

    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);
    

答案 1 :(得分:0)

虽然将void*转换为任何指针类型是正确的,但在C中没有必要,并且不建议用于malloc(例如,请参阅Do I cast the result of malloc?)。

此外,您应指定sizeof(xyz_t),而不是sieof(xyz_t*),否则您只为指针分配足够的内存,而不是整个结构。

当然,您应该指定handle,而不是*handle。并且handle应该是正确的指针类型(xyz_t*)。

哦,如果问题是关于将handle投射到xyz_t*,那么你可以像((xyz_t*)handle)->ab那样进行投放。

我建议在玩这样的指针之前先读一本书。

答案 2 :(得分:0)

我相信你希望句柄在函数调用后保存xyz_t结构的有效地址。然后你需要改变功能签名和内容,如下所示:

int Lookup (char *lookup, xyz_t **handle) {  // double indirection here

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

并称之为:

xyz_t *myhandle;
char lookup;  
Lookup(&lookup, &mynandle);

// now you can use it
myhandle->index ...

你也需要释放内存......

free(myhandle->ab);
free(myhandle);

答案 3 :(得分:0)

如果你想传递void *,这是解决方案

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

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

}