从空隙中铸造C形结构

时间:2014-11-16 20:05:05

标签: 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结构可能有不同类型的结构,所以我想动态投射,但是,这似乎不起作用。我如何在一个声明中完成此任务?

5 个答案:

答案 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;

LIVE DEMO

现在就它而言C.首先,我更喜欢为我的init定义finitstruct函数:

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;

LIVE DEMO

答案 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