我正试图在C中分配一个3D数组。正如你所知,它是用来存储图像数据的,格式为array[height][width][channel];这是我的密码。
BYTE*** allocateImageArray(INT_32 width, INT_32 height, INT_32 channels) {
BYTE*** array;
INT_32 i, j;
array = malloc(height * sizeof(BYTE**));
for(i = 0; i < height; i++) {
array[i] = malloc(width * sizeof(BYTE*));
for(j = 0; j < channels; j++) {
array[i][j] = malloc(channels * sizeof(BYTE));
}
}
printf("Pixel Array Size: %dn", sizeof(array));
return array;
}
它编译得很好。但是,数组的末尾总是8(由sizeof表示)。当我稍后在代码中尝试访问数组时,程序就会崩溃。
感谢所有的回答。
编辑:忘记收录。我已经算出了程序崩溃的发生地点。当我试图将值分配给数组末尾的一个BYTES时,就会发生这种情况。
sizeof
运算符不是这样工作的。如果它更像是一个特殊的#define
宏,它根据类型来计算某个东西的大小。
所以sizeof(array)
和sizeof(BYTE***)
是一样的,sizeof(void*)
对你的电脑来说显然是8。
BYTE**只是一个指针,所以在末尾sizeof(BYTE**)总是返回8。
您可以尝试以下代码:
#define value_at_index(a,i,j,k,m,n) (a)[(i)*m*n + (j)*n + (k)]
static BYTE*** allocateImageArray(int width, int height, int channels) {
BYTE (*array)[width][height];
array = malloc(width * height * channels * sizeof(BYTE));
array[1][2][3] = 1;
printf("array[1][2][3] = %d", array[1][2][3]);
return (BYTE***)array;
}
这样做,您就有了一个用于三维数组的连续内存空间,然后在main()中可以这样调用:
BYTE ***array = allocateImageArray(10, 20, 30);
printf("array[1][2][3] = %d", value_at_index(array, 1, 2, 3, 10, 20));
sizeof
运算符不会告诉您动态分配的数组的大小。
sizeof
返回底层数据类型的字节大小,在您的情况下,它是指向指向BYTE
的指针的指针。
由于array
仍然是一个指针(不管它指向什么),所以返回的8字节大小是有意义的。
请参阅sizeof运算符的说明。
旁白:
我还建议大家看看为什么sizeof(x++)不增加x?对于一个有趣的错误,sizeof
运算符和新程序员对它的假设可能会支持这个错误。
sizeof(array) ==
指针的字节数,在您的情况下为8个字节。