使用malloc()在C中分配三维数组



我正试图在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个字节。

相关内容

  • 没有找到相关文章

最新更新