如何在C中创建多维动态分配的数组?

问题描述 投票:2回答:2

在将此标记为重复之前,请注意我正在为任意维度的数组寻找更通用的解决方案。我在这里或在论坛上阅读了很多关于制作2D或3D整数数组的帖子,但这些是针对特定维度的特定解决方案。我想要一个任何维数组的通用解决方案。首先,我需要一个如下定义的intlist类型:

typedef struct{
   int l // length of the list
   int * e // pointer to the first element of the array
}intlist;

这实际上填补了C中用于处理数组的空白,就像指针一样。使用这种类型我可以将数组传递给函数,而不必担心丢失大小。然后在下一步中,我希望将mdintlist作为多维动态分配的数组。类型定义应该是这样的:

typedef struct Mdintlist{
    intlist d // dimension of the array
    /* second part */
}mdintlist;

第二部分有几种选择。选项是指向一个较低维度的mdintlist的指针

struct Mdintlist * c;

其他选项是使用void指针:

void * c;

我不知道如何从这里继续它。

附:一种解决方案可能是只分配一个内存块,然后使用函数调用元素。但是我想以数组形式调用元素。像tmpmdintlist.c [1] [2] [3] ...

希望我已经清楚地解释了我想要的东西。

附:这是一个古老的帖子,但对于那些可能在这里结束的人,我的一些努力可以在the Cplus repo中看到。

c arrays multidimensional-array
2个回答
2
投票

你不能!你只能使用c中的函数选项,因为没有办法改变语言语义。然而,在c ++中你可以重载[]操作符,即使我永远不会做这样一个丑陋的事情(x[1][2][3]是丑陋的,如果你继续添加“维度”它真的很难看),我认为这是可能的。


2
投票

好吧,如果你将指针和数组长度分开,最终会得到更少的代码。

int *one_dem_array;
size_t one_dem_count[1];

int **two_dem_array;
size_t two_dem_count[2];

int ***three_dem_array;
size_t three_dem_count[3];

这样您仍然可以使用您的首选符号。

int num_at_pos = three_dem_array[4][2][3];
© www.soinside.com 2019 - 2024. All rights reserved.