您好我有以下情况
#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
,那么应该如何修改结构定义?
答案 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)
个字节。