【问题标题】:Allocate two-dimensional array分配二维数组
【发布时间】:2026-02-10 05:45:01
【问题描述】:

如何使用malloc 分配二维数组? 这是我当前的代码:

typedef struct object product, *pprod;
struct object{
    int type;
    int quantity;
    pprod next;
};

pprod t[4][3];

非常感谢您的帮助。

【问题讨论】:

  • 目的是什么?给malloc 一些内存以将其用作pprod[n][3]
  • 其实我需要它是 pprod[n][m]
  • 您可以创建一个大小为 n*m 的向量 (singlePinter) 并使用 [index/rowSize][index%rowSize] 进行访问,因此您不必创建指针数组。
  • @demonofnight:C 从 1999 年开始支持可变长度数组,因此您无需手动进行地址运算。

标签: c pointers data-structures malloc


【解决方案1】:

要以布局与普通二维数组或数组数组兼容的方式分配内存,您需要一个指向适当大小数组的指针,

pprod (*t)[m] = malloc(n * sizeof *t);

因此t 是指向m 类型为pprod 元素的数组的指针,您可以简单地使用它

t[i][j]

好像它被宣布了

pprod t[n][m];

(如果malloc 不返回NULL)。

此分配分配一个连续的内存块,与分配 pprod ** 不同。

(注意:如果m 不是编译时常量,则要求编译器支持可变长度数组,它不适用于 MSVC。)

【讨论】:

  • 这就是我在 Xcode 中得到的消息“Initializer element is not a compile-time constant”
  • 不支持变长数组?嗯,我认为 Xcode 使用了 llvm-gcc,应该支持 VLA。您使用的编译器版本是什么?或者您是否正在编译为 C++? C++ 没有 VLA。
  • @CarlaPateiro "Initializer element is not a compile-time constant" 看起来您尝试使用非常量表达式初始化静态存储持续时间的数组(或struct)。你能用相应的源代码行发布确切的错误信息吗?
  • 编译器版本是:Apple LLVM compiler 4.2 这就是我想要做的:pprod (*t)[3] = malloc(4 * sizeof *t);
  • @CarlaPateiro 在文件范围内?你不能在文件范围内调用malloc,你必须在一个函数中这样做。
【解决方案2】:

对于二维数组,您应该定义一个指针,如:

typedef struct obj OBJECT;
OBJECT **2Dptr = malloc (sizeof(OBJECT*)*rows)
for(i=0;i<rows;i++)
  2Dptr[i]=malloc(sizeof(OBJECT)*total_objects) //columns

还有其他方法,您可以定义指向结构对象的指针数组。

if you want object[5][10]
you can create 5 pointers to array of 10 objects;

如果你希望内存是连续的,那么你可以这样做

*2Dptr=malloc(sizeof(OBJECT) * rows * cols);  //allocate contiguosly
**access_ptr = malloc(sizeof(OBJECT*) * rows);
for(i=0;i<row;i++)
   access_ptr[i]= 2Dptr+(i*cols);

【讨论】:

  • 如果downvoter 让我知道我错过了什么或错了什么,那么downvote 很棒!让大家学习!
  • 这不会创建二维数组。它创建一个指向一维数组的指针的一维数组。生成的内存通常不连续,不能传递给需要二维数组的例程。它还会导致不必要的指针查找,并阻止编译器进行二维数组可能的某些优化。
  • @EricPostpischil:即使它不连续也可以传递给函数,对吗?
  • 当传递给需要二维数组的函数时,它不会用作二维数组。它可以传递给一个函数,该函数需要一个指向对象数组的指针数组的指针。它们不是一回事,应该避免不必要的指向指针。
  • 不,int foo[m][n] 类型的表达式(int 数组的数组)被转换为 int (*)[n](指向 int 数组的指针)。仅转换第一个维度。 int (*)[n]int **兼容的。