我正在尝试在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: %d\n", sizeof(array));
return array;
}
编译好。但是,数组最后总是8(由sizeof表示)。当我稍后尝试在代码中访问数组时,程序就会崩溃。
感谢所有答案。
编辑:忘了包括。我已经解决了程序崩溃发生的地方。当我尝试将值赋给数组末尾的一个BYTES时会发生这种情况。答案 0 :(得分:2)
sizeof
运算符不会告诉您动态分配的数组的大小。
sizeof
返回基础数据类型的大小(以字节为单位),在您的情况下是指向指向BYTE
的指针的指针。
由于array
仍然是指针(无论指向什么),返回的8字节大小都有意义。
请参阅sizeof operator说明。
<强>除了:强>
我还建议您查看Why does sizeof(x++) not increment x?一个有趣的错误,该错误可以支持sizeof
运算符以及新程序员对此做出的假设。
答案 1 :(得分:2)
sizeof
运算符不能那样工作。认为它是否更像是一个特殊的#define
宏,根据其类型计算出某些内容的大小。
所以sizeof(array)
与sizeof(BYTE***)
相同,sizeof(void*)
与{{1}}相同,显然为您的计算机为8。
答案 2 :(得分:2)
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));
答案 3 :(得分:1)
sizeof(array) ==
指针的字节数,在你的情况下是8个字节。