我用这种方式分配了一个4D数组

array_4d = calloc(dim1, sizeof(array_4d[0]));
for(i = 0; i < dim1; i++){
    array_4d[i] = calloc(dim2, sizeof(array_4d[0][0]));
    for(j = 0; j < dim2; j++){
        array_4d[i][j] = calloc(dim3, sizeof(array_4d[0][0][0]));
        for(k = 0; k < dim3; k++){
            array_4d[i][j][k] = calloc(dim4, sizeof(array_4d[0][0][0][0]));
        }
    }
}

维度2和维度4将保持不变的大小,但维度1和维度3将需要随着时间的推移分配更多的空间.这不需要经常这样做,所以我计划将这些维度仅增加一个整数.

这是我目前拥有的代码,但我认为我甚至不是在正确的轨道上:

array_4d = (int ****)realloc(array_4d, new_dim1 * sizeof(int ***));
for (i = dim1; i < new_dim1; i++) {
    array_4d[i] = (int ***)calloc(dim2, sizeof(int **));
    for (j = 0; j < dim2; j++) {
        if (i < new_dim1 || j < dim2) {
            array_4d[i][j] = (int **)calloc(new_dim3, sizeof(int *));
            for (k = 0; k < new_dim3; k++) {
                if (i < new_dim1 || j < dim2 || k < new_dim3) {
                    array_4d[i][j][k] = (int *)calloc(dim4, sizeof(int));
                }
            }
        }
    }
}

因此,简而言之,我应该如何为DIM-1和DIM-3分配额外的一个空间块呢?(它们的大小相同)

推荐答案

...但我甚至不相信我走上了正确的道路

您似乎走上了"正确的道路",但您的解决方案并不完整/正确.简而言之,你需要更多的realloc电话.

让我们画出数据/内存 struct .为了保持绘图简单,让我们保持尺寸低,即让我们使用2为所有4个尺寸.在这种情况下,您的初始分配代码将生成以下内容:

enter image description here

现在让我们假设我们想把第一和第三维度增加到3.我们需要这样的 struct :

enter image description here

如果一块彩色单元格同时包含绿色和黄色单元格,则需要使用realloc来获得新的内存.

如果一块彩色单元格只包含黄色单元格,则需要使用calloc来获得新的内存.

如果一个彩色细胞块只包含绿色细胞,你不需要新的记忆.已经初步分配了.

特殊情况是当

  • 第一维度的运行计数器大于或等于旧的第一维度

  • 第三维度的运行计数器大于或等于旧的第三维度

在类似如下的代码中:

array_4d = realloc(array_4d, new_dim1 * sizeof(array_4d[0]));
for(i = 0; i < new_dim1; i++){
    if (i >= old_dim1) {
        array_4d[i] = calloc(dim2, sizeof(array_4d[0][0]));
    }
    for(j = 0; j < dim2; j++){
        if (i >= old_dim1) {
            array_4d[i][j] = calloc(new_dim3, sizeof(array_4d[0][0][0]));
        } else {
            array_4d[i][j] = realloc(array_4d[i][j], new_dim3 * sizeof(array_4d[0][0][0]));
        }
        for(k = 0; k < new_dim3; k++){
            if (i >= old_dim1 || k >= old_dim3) {
                array_4d[i][j][k] = calloc(dim4, sizeof(array_4d[0][0][0][0]));
            }
        }
    }
}

Important此代码仅用于增加尺寸(根据OP的要求).减少尺寸将需要额外的"特殊情况".

C++相关问答推荐

C如何显示字符串数组中的第一个字母

什么C代码将确定打开的套接字正在使用的网络适配器?

在struct中调用函数,但struct在void中 *

两个连续的语句是否按顺序排列?

使用GOTO从多个嵌套循环C继续

从纯C中访问通用项对话框

使用C时,Windows CMD中的argc参数是否包含重定向命令?

当输入负数时,排序算法存在问题

C-使用指针返回修改后的整数数组

如何在C++中处理按键

C指针概念分段故障

如何使用_newindex数组我总是得到错误的参数

如何只获取字符串的第一个单词,然后将其与c中的另一个单词进行比较?

在进程之间重定向输出和输入流的问题

C代码可以在在线编译器上运行,但不能在Leetcode上运行

链表删除 node 错误

在同一范围内对具有相同类型的变量执行的相同操作在同一C代码中花费的时间不同

从管道读取数据时丢失

C 预处理器中的标记分隔符列表

如何在C中以0x格式打印十六进制值