0

我有两个结构:

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 基本上。

这个对吗?

4

4 回答 4

1

您在多个方面做错了:

  1. 您正在尝试设置一个变量handle->ab,但handle它是一个void *,而不是结构类型指针。
  2. 你需要展示你的电话,但可能会出现问题——为什么你认为void *争论是个好主意?
  3. 你想分配结构,所以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);
于 2013-09-10T21:50:00.577 回答
0

如果你想通过 void *,这里是解决方案

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

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

}

于 2013-09-11T16:18:22.320 回答
0

虽然将 a 强制转换为void*任何指针类型都是正确的,但在 C 中不是必需的,也不建议这样做malloc(例如,请参阅Do I cast the result of malloc?)。

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

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

哦,如果问题是关于投射handlexyz_t*,那么你可以像((xyz_t*)handle)->ab.

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

于 2013-09-10T21:41:16.523 回答
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);
于 2013-09-10T21:49:20.653 回答