【问题标题】:How can I make multidimensional dynamically allocated arrays in C?如何在 C 中制作多维动态分配数组?
【发布时间】:2016-11-21 22:07:38
【问题描述】:

在将其标记为重复之前,请注意我正在为任意维度的数组寻找更通用的解决方案。我在这里或论坛上阅读了许多关于制作 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;

第二部分有几个选项。 on 选项是有一个指向较低维度的 mdintlist 的指针,例如

struct Mdintlist * c;

其他选项是使用 void 指针:

void * c;

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

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

希望我已经清楚地解释了我想要什么。

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

【问题讨论】:

  • tnx.我不知道。下次我会在那里问。
  • 您不能让array[2][3]array[2][3][4] 在同一个程序中代表数字。如果array[2][3][4] 是一个数字,那么array[2][3] 是一个数组或一个指针。您不能使这取决于 array 或其他变量包含的内容。类型是表达式的静态属性。
  • @SanchkeDellowar 我正在努力寻找答案,但是在编译时出现了一些错误。我应该在 stackoverflow 还是在 softwareengineering.stackexchange 上问这个问题?
  • @Foad Stackoverflow(顾名思义)适用于有错误的人。所以是的,只要你在你的问题上付出一些努力,SO就是调试错误的地方:)

标签: c arrays multidimensional-array


【解决方案1】:

你不能!您只能在 c 中使用 function 选项,因为无法更改语言语义。但是,在 c++ 中,您可以重载 [] 运算符,即使我永远不会做这么丑陋的事情(x[1][2][3] 已经很丑陋了,如果你继续添加“维度”,它会变得非常丑陋 ),我认为这是可能的。

【讨论】:

  • 其实我不确定我是否成功地解释了我需要什么。我不想改变语言。我要解决的主要问题是我失去了函数内数组的大小。我成功解决了定义 intlist 的一维数组的问题。但我不知道如何为多维数组实现这一点。
【解决方案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];

【讨论】:

  • 这实际上离我想要的更近了一步。除了我必须手动定义特定尺寸的指针。如果我可以使用 void 指针,然后每次都根据维度进行转换,那就太好了。
  • @Foad 那么你是一个可以解释 n 维数组的程序吗?
  • 在 C 中任何时候如果你有一个未知类型的变量,你必须使用 void 指针。
  • 是的,这就是我建议他们的原因。但是我只是无法弄清楚确切的形式。我知道如何为 void 指针 voidptr=typeptr 转换类型,然后使用 *(type *)voidptr 存储在那里的值...
  • 这就是你的问题:如果你有变量void *multi_dem_array,比方说N 维度,那么你怎么知道要编码多少索引?即multi_dem_array[index1][index2][...][indexN]。不幸的是,使您的请求无法实现。
猜你喜欢
  • 2015-06-23
  • 2013-04-02
  • 2017-09-28
  • 2017-03-18
  • 2011-08-29
  • 2013-11-14
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多