使用malloc()在C中分配3D数组

时间:2013-11-27 02:23:04

标签: c arrays pointers malloc multidimensional-array

我正在尝试在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时会发生这种情况。

4 个答案:

答案 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个字节。