【发布时间】:2016-12-30 16:34:37
【问题描述】:
我需要为 3D 数组分配连续空间。 (编辑:)我想我应该在第一时间明确这一点,但在实际的生产代码中,直到运行时我才会知道数组的尺寸。为了简单起见,我在下面的玩具代码中将它们作为常量提供。我知道坚持使用连续空间的潜在问题,但我必须拥有它。我已经看到如何为 2D 数组执行此操作,但显然我不明白如何将模式扩展到 3D。当我调用函数释放内存时,free_3d_arr,我得到一个错误:
lowest lvl
mid lvl
a.out(2248,0x7fff72d37000) malloc: *** error for object 0x7fab1a403310: pointer being freed was not allocated
如果有人能告诉我解决方法是什么,我将不胜感激。代码在这里:
#include <stdio.h>
#include <stdlib.h>
int ***calloc_3d_arr(int sizes[3]){
int ***a;
int i,j;
a = calloc(sizes[0],sizeof(int**));
a[0] = calloc(sizes[0]*sizes[1],sizeof(int*));
a[0][0] = calloc(sizes[0]*sizes[1]*sizes[2],sizeof(int));
for (j=0; j<sizes[0]; j++) {
a[j] = (int**)(a[0][0]+sizes[1]*sizes[2]*j);
for (i=0; i<sizes[1]; i++) {
a[j][i] = (int*)(a[j]) + sizes[2]*i;
}
}
return a;
}
void free_3d_arr(int ***arr) {
printf("lowest lvl\n");
free(arr[0][0]);
printf("mid lvl\n");
free(arr[0]); // <--- This is a problem line, apparently.
printf("highest lvl\n");
free(arr);
}
int main() {
int ***a;
int sz[] = {5,4,3};
int i,j,k;
a = calloc_3d_arr(sz);
// do stuff with a
free_3d_arr(a);
}
【问题讨论】:
-
a[0] = ...后跟a[j] = ...似乎很尴尬... -
没有 3D 数组,没有任何东西可以作为一个,也不能在你的代码中指向一个!指针不是数组!如果您需要 3D 阵列,请使用一个!哦,成为 3 星 C 程序员可不是恭维。
-
也就是说,SO 不是众包调试器 - 你应该自己投资调试它。
-
正在使用的实现是否支持 VLA?如果是,那么就做
int array3D[x][y][z]; -
不反对你所说的。但是,这种没有更多上下文的“抨击”评论对任何人都没有帮助。因为要么你已经知道它,要么你不理解它。朋克! @Olaf
标签: c arrays calloc contiguous