这并不难做到……关键是要意识到 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;
几个观察
- 就像 Matteo 说的,小心对齐。使用这种技术会从编译器接管内存布局,这可能会导致意外问题。如果这个警告对你没有意义,那么你可能不应该使用这种技术。
- 使用这种技术的理由之一是它可以通过减少需要管理的空闲数量来简化内存管理。如果您知道您的两个数组 x 和 y 都具有与其封闭结构相同的生命周期,那么这将消除一种潜在的内存泄漏类型。(以及通过减少内存块的数量来减少内存碎片的机会。)