我有两种结构:
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指针进行类型转换。
这是对的吗?
答案 0 :(得分:1)
你在多个方面做错了:
handle->ab
,但handle
是void *
,而不是结构类型指针。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);
答案 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));
//
}