gpt4 book ai didi

c - 将二维数组分配给 void*

转载 作者:行者123 更新时间:2023-11-30 20:19:17 27 4
gpt4 key购买 nike

我正在将一大块内存传递给我的子例程。在子例程中,我将此内存的部分分配给内部一维数组指针。

typedef struct
{
// float a[SIZE_A];
// float b[SIZE_B];
// float c[SIZE_C1][SIZE_C2];

float* a;
float* b;
float c[][SIZE_C2]; // float** c;
} OBJ;


void init( OBJ* obj, void* mem )
{
float* mem_p = (float*)mem;

obj->a = mem_p;
mem_p += SIZE_A;

obj->b = mem_p;
mem_p += SIZE_B;

obj->c = ?

}

如何分配第三个成员(二维数组)?

最佳答案

结构中的声明 float c[][SIZE_C2] 声明了一个内联存储在结构中的数组的数组。该声明不包含任何引用存储在其他地方的数组的指针。

如果您希望保留当前的结构签名,可以按如下方式填充 c:

memcpy(&obj->c, mem_p, SIZE_C1 * SIZE_C2 * sizeof(float));

这会将数据从 mem_p 复制到连续的数组数组 c 中,之后 c 不会引用 中的任何数据memab 的情况一样,但保存其自己的数据副本。

请记住,您的结构当前将 c 作为“灵活数组成员”,因为最外层数组具有未指定的大小,这意味着您的结构必须通过 malloc< 动态分配 或类似的,并且必须给予额外的空间来容纳末尾的数组元素:

OBJ *obj = malloc(sizeof *obj + SIZE_C1 * sizeof(float));

如果您打算仅在 obj 中存储引用 mem 引用的内存的指针,而不存储单独的副本,以便 c 保持一致对于 ab,您必须将结构中的 c 声明更改为以下内容:

float (*c)[SIZE_C2];

这将 c 声明为“指向 SIZE_C2 元素数组的指针”(可能位于连续的数组序列中),而不是“由SIZE_C2 元素数组”。

这可以在您的 init 函数中填充,如下所示:

obj->c = (float (*)[SIZE_C2]) mem_p;

如果您希望在 c 之后分配更多的 float 字段,您可以像这样继续递增 mem_p,而无需将其转换为指针-to-array,因为 C 中数组的大小只是其元素类型的大小乘以其元素的数量:

/* sizeof(float [SIZE_C2]) == SIZE_C2 * sizeof(float) */
/* mem_p is a `float *` so goes up in steps of `sizeof(float)` */
mem_p += SIZE_C1 * SIZE_C2;

通过这种方法,元素仍然可以作为 obj->c[1][2] 进行访问,就像使用当前结构体的签名一样。

由于在 C 中使用指向数组的指针有点棘手,并且要求内部数组具有固定大小,因此您可能会发现将 c 存储为常规单个 更合适float * 指针并手动寻址元素,就好像它是一个二维数组一样,例如:

float f = obj->c[row * SIZE_C2 + col];

关于c - 将二维数组分配给 void*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50813530/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com