如果我理解您的问题,您有一个当前的 5D 数组,您需要为该数组分配存储空间并制作该数组的副本,然后您希望以顺序方式访问这些值。正如其他人所指出的,该方法是使用 指向 4D 数组的指针 分配一块内存 dim1 * sizeof 4D 来保存现有数组。 (您可以考虑为构成 5D 数组的 dim1 行 分配)。然后,您可以简单地复制现有数组(使用memcpy 等),然后分配一个指向第一个元素的指针以进行顺序访问。
好处是您可以分配一个块来保存现有数组的副本。使用完副本后,这将只需要一个 free。
这不适用于伪造的(指向指针的指针...内存集合)
下面是创建dim1 指针的简短示例,该指针指向构成现有数组的剩余4d 的内容(在单个块分配中),其中除了dim1 之外的所有维度在编译时都是已知的。现有的 5D 数组 a 被复制到分配给 b 的新内存块中。然后将整数指针“p”分配给b 的起始地址。 b的值是通过指针p顺序访问的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void) {
int a[2][2][2][2][2] = { { { {{1,2}, {3,4}}, /* 5D Array */
{{5,6}, {7,8}} },
{ {{1,2}, {3,4}},
{{5,6}, {7,8}} } },
{ { {{1,2}, {3,4}},
{{5,6}, {7,8}} },
{ {{1,2}, {3,4}},
{{5,6}, {7,8}} } } };
/* ptr to 5D, ptr to int* */
int (*b)[2][2][2][2] = NULL, *p = NULL;
/* allocate block to hold a */
b = malloc (sizeof a/sizeof *a * sizeof *b);
memcpy (b, a, sizeof a/sizeof *a * sizeof *b); /* copy a to b */
p = ****b; /* assign address of first element */
printf ("\nb:\n"); /* ouput using sequential access */
for (int i = 0; i < (int)(sizeof a/sizeof *****a); i++)
printf (" *(p + %2d) : %d\n", i, p[i]);
free (b); /* single free is all that is required */
return 0;
}
使用/输出示例
$ ./bin/arr5dstatic1
b:
*(p + 0) : 1
*(p + 1) : 2
*(p + 2) : 3
*(p + 3) : 4
*(p + 4) : 5
*(p + 5) : 6
*(p + 6) : 7
*(p + 7) : 8
*(p + 8) : 1
*(p + 9) : 2
*(p + 10) : 3
*(p + 11) : 4
*(p + 12) : 5
*(p + 13) : 6
*(p + 14) : 7
*(p + 15) : 8
*(p + 16) : 1
*(p + 17) : 2
*(p + 18) : 3
*(p + 19) : 4
*(p + 20) : 5
*(p + 21) : 6
*(p + 22) : 7
*(p + 23) : 8
*(p + 24) : 1
*(p + 25) : 2
*(p + 26) : 3
*(p + 27) : 4
*(p + 28) : 5
*(p + 29) : 6
*(p + 30) : 7
*(p + 31) : 8
其余的 cmets 和答案建议您找到使用 5D 阵列设置以外的其他方法,这是有充分理由的。调查一下是否可以修改生成原始 5D 数组中捕获的数据的任何内容,以便以其他格式输出数据。