2025.01 更新
经过深入学习c语言编译器后,了解到可以使用此方式实现。
1
| int (*v)[30][20] = (int (*)[30][20])malloc(sizeof(*v));
|
使用时对v解引用即可得到数组。
注意结合顺序:后缀运算符优于前缀,因此括号是必须的。
原文
最近在学习数据结构,学习到栈结构,遂打算以二维数组实现栈结构。由于在此之前我并没有实际在函数中操作二维数组,所以此次的写代码颇为曲折,当然最终还是有所收获的。
二维数组本质上也是数组,所以在c的函数中对二维数组进行操作依旧是对普通数组的操作。
首先我们需要有对这个二维数组的初始化函数InitStack
,参数为char ** stack
。
此时出现一个问题,我需要对指针使用malloc
分配堆内存,即使我传入的是一个指针,但是依旧无法分配内存,
1 2 3 4 5 6 7 8 9 10
| int InitStack(char** stackElem, int ElemNum) { stackElem = (char**)malloc(ElemNum * sizeof(char*)); for (int i = 0; i < ElemNum; i++) { stackElem[i] = (char*)malloc(sizeof(char) * 128); }
return 0; }
|
由于我本身需要操作的是指针(分配内存),而为了能在函数内操作,我需要获取操作对象的指针,也就是指针的指针(&stackElem),
代码修改过后为
1 2 3 4 5 6 7 8 9 10 11
| int InitStack(char*** stackElem, int ElemNum) { char **stackElemTmp = (char**)malloc(ElemNum * sizeof(char*)); for (int i = 0; i < ElemNum; i++) { stackElemTmp[i] = (char*)malloc(sizeof(char) * 128); } *stackElem = stackElemTmp; return 0; } char** stackElem=NULL; InitStack(&stackElem);
|
传入一个二维数组的指针,让这个指针指向分配过内存的二维数组从而实现二维数组通过malloc
分配内存。