C 在结构内部从 void * 进行类型转换

标签 c

我试图在结构中转换结构,但遇到了问题,这是我的简化代码:

#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 结构中可能有不同类型的结构,所以我想动态转换,但是,这似乎不起作用。如何在一条语句中完成此操作?

最佳答案

将分配分成两部分,首先:

abc *mystruct = malloc( sizeof(abc) );

但是,当您尝试做时(如果测试会被正确转换)

mystruct->test->a

test 成员没有指向任何地方,通过取消引用它你会得到未定义的行为。 首先将其指向有效内存

mystruct->test = malloc( sizeof( def ) ) ;

然后就可以使用了:

( ( def *)mystruct->test )->a = 3;
^                        ^

注意括号,您正在转换成员 void,它是 mystruct->test 而不仅仅是 test

关于C 在结构内部从 void * 进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26961463/

相关文章:

c - 将复合语句置于 for 循环的条件中

c - 如何强制 OpenMPI 使用 GCC 而不是 ICC?是否需要重新编译 OpenMPI?

c - C中二进制文件的路径

c - 编译器会处理像 if(0) 这样无用的代码吗?

c++ - 如果指针已标记为 const,是否限制 C 中的帮助?

c - c中的静态矩阵乘法到动态矩阵

c - (C) - 如何比较 2 个 txt 文件 REQUESTS.txt 和 AVAILABLE.txt,将读取的每个 str 分隔成 (STR6、STR3、STR3、INT) 格式的结构?

c - 如何在 Visual Studios 中使用 CreateProcess 函数

计算我的 C 程序的执行时间?

c - 使用 VS2010 构建的应用程序在 VS-Express2008 中不起作用 - C