使用mmap(),如何创建动态大小的结构

时间:2012-03-02 12:18:54

标签: c dynamic struct mmap

您好我有以下情况

#define CONSTANT 10

struct structA{
    int var1;
    int var2[CONSTANT];
};

main(){
    structA *varA = NULL;
    int i;

    /* some C code */


    varA = mmap(0,..);
    for(i = 0; i < CONSTANT; i++){
        varA.var2[i] = /* C code */ ;
    }

    /* C code */

}

此处var2 structA数组中的元素数量是常量,因此可以直接引用varA.var2[i]。但是如果要在运行时动态确定数字CONSTANT,那么应该如何修改结构定义?

3 个答案:

答案 0 :(得分:3)

最干净的方法是使用C99灵活阵列成员:

struct structA{
    int var1;
    int var2[];
};

然后你可以mmap(NULL, sizeof(int) * (num + 1), ...)。请注意灵活的数组成员,sizeof表现得很有趣(不包括它们的大小)。

如果您不能/不会使用灵活的数组成员,则可以分别使用指针而不是数组和mmap内存。

答案 1 :(得分:2)

最常见的方法是:

struct structA{
    int var1;
    int var2[1];
};

它实际上不是一个包含单个元素的数组,因为您分配的内存大于structA的大小。

答案 2 :(得分:1)

无法在运行时动态确定数字CONSTANT,因为它会影响结构大小。

你正在尝试做的通常技巧(我不确定它是否是严格有效的C,但它很常见)是创建

struct structA{
    int var1;
    int var2[0];
};

当您映射或分配时,分配(sizeof(structA) + sizeof(int) * CONSTANT)个字节。