我有两个结构:
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
,但是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);
关于c - 类型转换void指针并分配内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18729151/