在C语言中为结构体中的数组分配连续的内存地址

4
我想知道如何为另一个结构体中的结构体数组分配连续的内存。假设我有struct1,其中包含struct2的数组,我希望它们都在一个连续的内存块中。
我可以使用malloc来分配内存块,但是如何分配数组的内存呢?
struct1 *set = malloc(sizeof(struct1) + sizeof(struct2)*number_of_structs);
set->arr = (struct2*)set + sizeof(struct); //This is probably wrong
set->arr[0].data = 1;
set->arr[1].data = 2; 
...

谢谢你。

2个回答

3

使用 柔性数组成员

#define NUM_ELEM  42

struct a {
   /* whatever */    
};

struct b {
    int c;
    struct a d[];  // flexible array member
};

struct b *x = malloc(sizeof *x + NUM_ELEM * sizeof x->d[0]);

其实,如果我不能使用可变数组,还有其他方法吗? - dead_jake
如果您的编译器不支持c99,您可以使用旧方法称为结构体技巧:在struct b声明中使用struct a d[1];而不是struct a d[];并分配少一个元素: malloc(sizeof *x + (NUM_ELEM - 1) * sizeof x->d[0]) - ouah

2

这种方式在某些Windows API中使用,可能是这样的:

struct struct1
{
     // some members ...

     struct struct2 arr[1];
}

struct1 *set = malloc(sizeof(struct1) + sizeof(struct2) * (number_of_structs-1));

set->arr指向一个包含number_of_structs个成员的数组。struct1总是至少包含一个内部的struct2 + 其他连续内存块中的struct2成员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接