c - 单个 malloc 调用中的二维数组

标签 c multidimensional-array malloc

int **arrayPtr; 
arrayPtr = malloc(sizeof(int) * rows *cols + sizeof(int *) * rows);

在上面的代码中,我们尝试在单个 malloc 调用中分配一个二维数组。 malloc 获取一定数量的字节并为那么多字节分配内存, 但是在上面的例子中,malloc 怎么知道首先它必须分配一个指针数组,每个指针指向一个一维数组?

malloc 在这种特殊情况下如何在内部工作?

最佳答案

二维数组与指向数组的指针数组不同。

int **arrayPtr 没有定义二维数组。二维数组如下所示:

整数数组[2][3]

指向该数组第一个元素的指针如下所示:

int (*array)[3]

你可以指向一 block 内存:

int (*array)[3] = malloc(sizeof(int)*5*3);


注意它是如何编入索引的:

  • array[x] 将扩展为 *(array+x),因此“x 个 3 整数数组向前”。
  • array[x][y] 将扩展为 *( *(array+x) + y),因此“然后 y 整数转发”。

这里没有直接的指针数组,只有一个连续的内存块。

如果你有一个数组数组(与 2D 数组不同,通常使用 int** ptr 和一系列每行 mallocs 完成),它会像:

  • ptr[x] 会扩展为 *(array+x),所以“x pointers forward”
  • ptr[x][y] 将扩展为 *( *(array+x) + y) = "y ints forward"。

注意区别。两者都使用 [x][y] 进行索引,但它们在内存中以不同的方式表示,并且索引以不同的方式进行。

关于c - 单个 malloc 调用中的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10953787/

相关文章:

c - C中的单利计算程序总是返回0作为结果

c - fscanf 跳过我的第一个字符

c++ - 从二进制中提取数组数据的正确方法?

c - C语言中的fork()函数

c - 释放 malloc 指针时出错

php - 如何在 php 中对多维关联数组的重复值进行分组?

php - 如何使用 php 从 strip 响应中检索数据

c - 在C中使用二维数组时出现"too many braces around scalar initializer"错误

c - openmp 在指针数组和指向数组的指针之间的性能差异有什么问题?

c++ - 如果我在 C++ 中调用 new,但堆内存不足,会发生什么情况?