【问题标题】:Allocating a 3D array in C using malloc()使用 malloc() 在 C 中分配 3D 数组
【发布时间】:2013-11-27 02:23:04
【问题描述】:

我正在尝试在 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 表示)。当我稍后在代码中尝试访问数组时,程序就会崩溃。

所有答案都在此致谢。

编辑:忘记包含。我已经弄清楚程序崩溃发生的位置。当我尝试将值分配给数组末尾的一个字节时,就会发生这种情况。

【问题讨论】:

  • 为什么不array = malloc(height * width * channel * sizeof(BYTE));
  • 这实际上是我的原始代码,但它也有同样的问题。此外,它没有定义有多少行、多少列和(无论第 3 维被称为什么)是吗?
  • 这取决于您如何访问元素。以array[0][0][0] 为例。
  • 是的,我想使用数组表示法访问它们,即 Array[x][y][z]。

标签: c arrays pointers malloc multidimensional-array


【解决方案1】:

sizeof 运算符不能这样工作。想想它是否更像是一个特殊的#define 宏,它根据其类型计算出某物的大小。

所以sizeof(array)sizeof(BYTE***) 相同,sizeof(void*) 与您的计算机显然是 8 相同。

【讨论】:

  • 感谢这两个答案。说得通。关于它为什么崩溃的任何想法?分配它的代码是错误的,还是其他可能的问题?当我尝试为其中一个数组条目赋值时,我已经解决了崩溃问题。
【解决方案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;
}

这样做,你有一个连续的内存空间用于 3 维数组,然后在 main() 中你可以这样调用:

BYTE ***array = allocateImageArray(10, 20, 30);
printf("array[1][2][3] = %d", value_at_index(array, 1, 2, 3, 10, 20));

【讨论】:

  • 我已经编辑了我的答案。我尝试了我的旧代码,我意识到返回一个指针是行不通的,因为它不知道如何解释BYTE ***array = allocateImageArray(10, 20, 30); 的结果所以我为此添加了#define 宏。
【解决方案3】:

sizeof 运算符不会告诉您动态分配的数组的大小。

sizeof 返回底层数据类型的大小(以字节为单位),在您的情况下,它是指向指向 BYTE 的指针的指针。

由于array 仍然是一个指针(不管它指向什么),返回的 8 字节大小是有意义的。

请参考sizeof operator的解释。

旁白:

我还建议查看 Why does sizeof(x++) not increment x? 以了解一个有趣的错误,该错误可以支持 sizeof 运算符以及新程序员对此的假设。

【讨论】:

    【解决方案4】:

    sizeof(array) == 指针的字节数,在您的情况下为 8 个字节。

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 2015-08-04
      • 1970-01-01
      • 2018-09-21
      • 2019-06-07
      • 2022-11-10
      • 1970-01-01
      • 2012-10-10
      • 2014-07-06
      相关资源
      最近更新 更多