我在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;
Run Code Online (Sandbox Code Playgroud)
如果我们需要像这样分配内存:
malloc(sizeof(EthgenSig) + sizeof(Name) * 10);
Run Code Online (Sandbox Code Playgroud)
如何分配内存,如果我们先操作name
数组然后再操作nim
数组,那么nim[1]
会覆盖name
数组,然后如何解决呢?
由于您指出的确切原因,您不能拥有多个灵活阵列成员.
最多,如果你需要将数据保存在同一个内存块中,你可以制作name
和nim
指针并设置它们在分配后指向正确位置的位置(确保不破坏任何对齐约束),但最简单(和最明智的事情就是分别为name
和分配数组nim
.
小智 6
这并不难做...关键是要认识到C中的数组和指针都具有非常相似的属性。实际上,数组访问器表示法与指针表示法有直接对应:
a[b] == *(a + b);
Run Code Online (Sandbox Code Playgroud)
请注意,这具有使数组名和索引名可互换的作用,因此也是如此:
a[b] == b[a];
Run Code Online (Sandbox Code Playgroud)
您可以使用它来获得所需的结果。首先,声明一个带有两个指针元素的结构。这提供了两个指针,它们将存储两个数组的基地址:
struct two_blocks {
int *x;
int *y;
}
Run Code Online (Sandbox Code Playgroud)
分配此结构时,需要为两个数组的主体分配额外的空间:
#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));
Run Code Online (Sandbox Code Playgroud)
然后最后一步是初始化两个数组指针。(这些表达式使用了大量的指针类型强制转换,以确保指针算术以单个字节完成。指针算术通常以所指向对象的大小为单位进行,以支持我上面提到的数组/指针等效项。 )
data->x = (int *)(((char *)data) + sizeof(two_blocks));
data->y = (int *)(((char *)data) + sizeof(two_blocks) + X_SIZE * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
从那里,可以像您期望的那样使用数组:
data->x[2] = 42;
data->x[2] = 42;
Run Code Online (Sandbox Code Playgroud)
几个观察