我在c结构中有多个灵活的数组:
typedef struct
{
int a;
float b;
} Name;
typedef struct
{
int c;
int d;
int e;
} NIM;
typedef struct
{
int age;
int time;
Name name[1];
NIM nim[1];
} EthgenSig;
如果我们需要像这样分配内存:
malloc(sizeof(EthgenSig) + sizeof(Name) * 10);
如何分配内存,如果我们首先运算name
数组,然后我们稍后运行nim
数组,那么nim[1]
将覆盖name
数组,然后怎么解决呢?
答案 0 :(得分:6)
由于您指出的确切原因,您不能拥有多个灵活阵列成员。
最多,如果您需要将所有数据保存在同一个内存块中,您可以制作name
和nim
指针并设置分配后指向正确位置的位置(确保不要破坏任何对齐约束),但最简单(也是最明智的)就是分别为name
和nim
分配数组。
答案 1 :(得分:4)
这并不难做到......关键是要意识到C中的数组和指针都具有非常相似的属性。实际上,数组访问符号与指针符号直接对应:
a[b] == *(a + b);
请注意,这样可以使数组名称和索引可以互换,所以这也是如此:
a[b] == b[a];
您可以使用它来达到您想要的效果。首先,声明一个带有两个指针元素的结构。这提供了两个指针,用于存储两个数组的基址:
struct two_blocks {
int *x;
int *y;
}
分配此结构时,您需要为两个数组的主体分配额外空间:
#define X_SIZE 3
#define Y_SIZE 4
two_blocks *data = (two_blocks *)malloc(sizeof(two_blocks)
+ (sizeof(int) * X_SIZE)
+ (sizeof(int) * Y_SIZE));
然后最后一步是初始化两个数组指针。 (这些表达式使用大量的指针类型转换来确保指针算法以单个字节完成。指针算法通常以指向的对象大小为单位进行,以支持上面提到的数组/指针等价。 )
data->x = (int *)(((char *)data) + sizeof(two_blocks));
data->y = (int *)(((char *)data) + sizeof(two_blocks) + X_SIZE * sizeof(int));
从那里,阵列可以像你期望的那样使用:
data->x[2] = 42;
data->x[2] = 42;
一些观察
答案 2 :(得分:-1)
当涉及到这个结构的内存布局时,拥有一个大小为1
的数组与完全没有数组相同。
你可以这样:
typedef struct
{
int age;
int time;
Name name;
NIM nim;
} EthgenSig;
但我认为这不是你想要的。很难说出你真正想要的东西。但我假设你真的想要这个:
typedef struct
{
int age;
int time;
Name* name;
NIM* nim;
} EthgenSig;
foo = malloc(sizeof(EthgenSig);
foo.name = malloc(sizeof(Name)*10);
foo.nim = malloc(sizeof(Nim) * 10);