在 C 中使用 malloc 动态创建一个二维指针数组
Dynamically creating a 2D array of pointers using malloc in C
这是我正在使用的结构:
struct nodeList//a node structure
{
int jump;
int config;
int level;
int shifts[200];
int shift_diff[200];
struct nodeList *next;
};
我想创建一个可用于引用此类结构变量的二维指针数组,即该数组的任何元素都可以分配一个指向结构变量的指针。如果可能的话,我更愿意使用 malloc 动态创建数组。任何指针(双关语意想不到的)将不胜感激。
首先请大家在程序设计上三思。你真的需要一个二维指针数组,每个指针指向一个结构,每个结构包含一些项目吗?这些要求相当复杂:如果你能简化它们,你的程序就会好得多。
由于当前的要求,您会注意到指针和数组语法将变得相当复杂,这是要求的罪魁祸首,比 C 语言更复杂。
考虑使用二维结构数组,或使用某种基于指针的 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];
含义:"in the 2D array, give me item number [i][j]".
如果你省略了类型的最内层维度,你可以简化这个语法:
struct nodelist* (*array_ptr)[Y]; // pointer to a 1D array
malloc 将是相同的,但您现在可以像这样使用它,这可能更直观:
array_ptr[i][j];
含义:"in array number i, give me item number j"。你在这里假设相邻内存中有一个数组数组,这是真的。
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 所说,如果没有必要更改设计。
这是我正在使用的结构:
struct nodeList//a node structure
{
int jump;
int config;
int level;
int shifts[200];
int shift_diff[200];
struct nodeList *next;
};
我想创建一个可用于引用此类结构变量的二维指针数组,即该数组的任何元素都可以分配一个指向结构变量的指针。如果可能的话,我更愿意使用 malloc 动态创建数组。任何指针(双关语意想不到的)将不胜感激。
首先请大家在程序设计上三思。你真的需要一个二维指针数组,每个指针指向一个结构,每个结构包含一些项目吗?这些要求相当复杂:如果你能简化它们,你的程序就会好得多。
由于当前的要求,您会注意到指针和数组语法将变得相当复杂,这是要求的罪魁祸首,比 C 语言更复杂。
考虑使用二维结构数组,或使用某种基于指针的 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];
含义:"in the 2D array, give me item number [i][j]".
如果你省略了类型的最内层维度,你可以简化这个语法:
struct nodelist* (*array_ptr)[Y]; // pointer to a 1D array
malloc 将是相同的,但您现在可以像这样使用它,这可能更直观:
array_ptr[i][j];
含义:"in array number i, give me item number j"。你在这里假设相邻内存中有一个数组数组,这是真的。
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 所说,如果没有必要更改设计。