我正在尝试在结构体中构建一个结构但遇到问题,这是我的简化代码:
#include <stdlib.h>
typedef struct {
void *test;
} abc;
typedef struct {
int a;
int b;
} def;
int main()
{
abc *mystruct = malloc(sizeof(abc) + sizeof(def));
mystruct->(def *)test->a = 3;
return 0;
}
abc结构可能有不同类型的结构,所以我想动态投射,但是,这似乎不起作用。我如何在一个声明中完成此任务?
答案 0 :(得分:1)
将分配分为两部分,第一部分:
abc *mystruct = malloc( sizeof(abc) );
但是,当你尝试做(如果测试将被正确施放)
mystruct->test->a
test
成员没有指向任何地方,通过解除引用它会得到未定义的行为。
首先将其指向有效内存
mystruct->test = malloc( sizeof( def ) ) ;
然后你可以使用它:
( ( def *)mystruct->test )->a = 3;
^ ^
注意括号,您正在构建mystruct->test
的成员void,而不只是test
。
答案 1 :(得分:1)
从void*
进行投射时,正确的方法是在C ++中使用static_cast
:
abc *mystruct = static_cast<abc*>(malloc(sizeof(abc)));
mystruct->test = malloc(sizeof(def));
static_cast<def*>(mystruct->test)->a = 3;
现在就它而言C.首先,我更喜欢为我的init
定义finit
和struct
函数:
struct abc*
abc_init(int sz) {
struct abc *out = (abc*) malloc(sizeof(abc));
out->test = malloc(sz);
return out;
}
void
abc_finit(struct abc *in) {
if(in) {
if(in->test) free(in->test);
free(in);
}
}
请注意,struct abc
的分配分两步完成struct abc
的内存,然后是成员test
的内存。
现在,施法就像:
((def*)(mystruct->test))->a = 3;
答案 2 :(得分:1)
更常见的是,你会使用union
来做这类事情:
typedef union {
struct {
int a;
int b;
} def;
/* ..other variants you might want */
} abc;
int main() {
abc *mystruct = malloc(sizeof(abc));
mystruct->def.a = 3;
/* do stuff with it */
答案 3 :(得分:0)
尝试以下
#include <stdlib.h>
#include <stdio.h>
typedef struct {
void *test;
} abc;
typedef struct {
int a;
int b;
} def;
int main()
{
abc *mystruct = malloc( sizeof( abc ) );
if ( mystruct )
{
mystruct->test = malloc( sizeof( def ) );
if ( mystruct->test )
{
( ( def * )mystruct->test )->a = 3;
printf( "%d\n", ( ( def * )mystruct->test )->a );
}
}
if ( mystruct ) free ( mystruct->test );
free( mystruct );
return 0;
}
输出
3
答案 4 :(得分:-1)
(已更正)((def *)mystruct->test)->a = 3;
类型转换运算符的优先级低于 - &gt;操作者 Here is the reference