分配二维数组

3
我该如何使用malloc来分配二维数组? 这是我目前的代码:
typedef struct object product, *pprod;
struct object{
    int type;
    int quantity;
    pprod next;
};

pprod t[4][3];

非常感谢您的帮助。

目的是什么?是为了使用pprod[n][3]而分配一些内存空间吗? - Daniel Fischer
1
实际上我需要它是pprod[n][m]。 - Carla Pateiro
你可以创建一个大小为n*m的向量(singlePointer),并使用[index/rowSize][index%rowSize]进行访问,这样就不必创建指针数组了。 - Lefsler
@demonofnight:C语言自1999年起支持可变长度数组,因此您无需进行手动地址算术运算。 - Eric Postpischil
2个回答

3
为了使分配的内存布局与正常的二维数组或数组的数组兼容,您需要一个指向适当大小的数组的指针。
pprod (*t)[m] = malloc(n * sizeof *t);

因此,t是指向类型为pprodm个元素的数组的指针,您可以直接使用它。
t[i][j]

仿佛它已经被声明一样。
pprod t[n][m];

(如果malloc没有返回NULL)。

这种分配方式会分配一块连续的内存块,不像分配一个pprod **那样。

(注意:如果m不是编译时常量,需要编译器支持可变长度数组,否则在MSVC上无法使用。)


"Initializer element is not a compile-time constant(初始化元素不是编译时常量)"。 - Carla Pateiro
变长数组不受支持?嗯,我以为Xcode使用llvm-gcc,它应该支持VLAs。你使用的编译器版本是什么?或者你可能正在编译为C++吗?C++没有VLAs。 - Daniel Fischer
@CarlaPateiro "Initializer element is not a compile-time constant" 看起来你试图用非常量表达式初始化一个静态存储期的数组(或结构体)。你能否发布带有相应源代码行的确切错误消息? - Daniel Fischer
编译器版本是:Apple LLVM编译器4.2这是我正在尝试做的事情: pprod (*t)[3] = malloc(4 * sizeof *t); - Carla Pateiro
@CarlaPateiro 在文件范围内吗?你不能在文件范围内调用malloc,必须在函数中执行。 - Daniel Fischer

1
对于二维数组,您应该定义一个指针,例如:
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);

@EricPostpischil:即使它不是连续的,也可以传递给函数,对吧? - Dineshkumar
1
当传递给期望二维数组的函数时,它不会作为二维数组运作。它可以被传递给期望指向对象数组指针的指针数组的函数。它们不是同一件事,应该避免使用不必要的指针。 - Eric Postpischil
@EricPostpischil:[初学者] 无论如何它不会被转换为指针吗?(int **arr)? - Dineshkumar
2
不,类型为 int foo[m][n](二维整型数组)的表达式会被转换为 int (*)[n](指向一维整型数组的指针)。只有第一维会被转换。int (*)[n]int **不兼容的。 - Eric Postpischil
@Dineshkumar 指针不是数组,数组也不是指针,它们之间不能互换。 - user529758
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接