【问题标题】:Dynamically creating a 2D array of pointers using malloc in C在 C 中使用 malloc 动态创建一个二维指针数组
【发布时间】:2015-06-11 10:22:41
【问题描述】:

这是我正在使用的结构:

struct nodeList//a node structure
{
    int jump;
    int config;
    int level;
    int shifts[200];
    int shift_diff[200];
    struct nodeList *next;
};

我想创建一个可用于引用此类结构变量的指针的二维数组,即该数组的任何元素都可以分配一个指向结构变量的指针。如果可能的话,我宁愿使用 malloc 动态创建数组。任何指针(双关语无意)将不胜感激。

【问题讨论】:

  • 什么是struct struct
  • 感谢您指出......我猜是使用 sublime 测试和控制 + d 的缺点

标签: c arrays pointers malloc


【解决方案1】:

首先,请三思而后行的程序设计。你真的需要一个二维指针数组,每个指针指向一个结构,每个结构包含许多项目?这些要求相当复杂:如果你能简化它们,你的程序就会变得更好。

由于当前的需求,您会注意到指针和数组的语法将变得相当复杂,这是需求的罪魁祸首,比 C 语言更复杂。

考虑使用 2D 结构数组,或使用某种基于指针的 ADT,这对您的给定情况(链表、队列、图、二叉树等)有意义。


话虽如此,指向结构的二维指针数组:

struct nodelist* array[X][Y];

要动态分配它,您需要一个 指向 struct 指针的二维数组的指针

struct nodelist* (*array_ptr)[X][Y];

然后将其分配给结构指针的二维数组,动态分配:

array_ptr = malloc( sizeof(struct nodelist*[X][Y]) );

...
free(array_ptr);

请注意,除非二维数组没有像上面那样分配,否则在相邻的内存单元中,它不是数组


编辑。顺便说一句,如果你想避免数组指针产生的奇怪语法,有一个技巧。使用上面的代码,您必须将数组寻址为

(*array_ptr)[i][j];

含义:“在二维数组中,给我项目编号[i][j]”。

如果你省略了类型的最里面的维度,你可以简化这个语法:

struct nodelist* (*array_ptr)[Y]; // pointer to a 1D array

malloc 将是相同的,但您现在可以像这样使用它,这可能更直观:

array_ptr[i][j];

含义:“在数组编号 i 中,给我项目编号 j”。您在这里假设相邻内存中有一个数组数组,这是真的。

【讨论】:

  • 请注意,他必须显式取消引用 array_ptr 才能访问元素:(*array_ptr)[i][j] = &some_struct。最好将该声明更改为struct nodelist *(*array_ptr)[cols]; array_ptr = malloc( rows * sizeof *array_ptr);。这样他就不必明确取消引用:array_ptr[i][j] = &some_struct;
  • @JohnBode 具有讽刺意味的是,你在输入那条很棒的评论的同时,我已经在写一个编辑建议了:)
  • 为复杂的逻辑道歉。不得不处理别人的基本代码;因此限制。将消息传递给原作者。
【解决方案2】:
 NODELIST ***pppNode, Node;
 size_t Row = 5, Col = 5, i;

 pppNode = malloc( sizeof(NODELIST **) * Row );

 for(i = 0; i < Row; i++)
      pppNode[i] = malloc( sizeof(NODELIST *) * Col );

 pppNode[1][0] = &Node;

这是另一种动态分配方式,但正如@Lundin 所说,如果没有必要更改设计。

【讨论】:

  • 然而,这不是二维数组。这是一个分段的……东西。避免这种风格,因为它只会使程序变慢,更难阅读和维护,并且会使堆碎片化。 See this。一般来说,避免三星级编程。
猜你喜欢
  • 2021-03-28
  • 2011-02-19
  • 2021-08-22
  • 1970-01-01
  • 2014-03-06
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多