我有一个练习,我应该使用固定大小的数组和输入/输出参数来处理矩阵(添加,扫描,打印等),但我想在任意长度的矩阵上做它并返回它们不是每次都添加更多(in /)输出参数(因此可能允许更"功能"的风格).
由于我想返回它们,我想我可能需要malloc来保持数组在内存中传递函数作用域.因为我想使用多维下标符号(mat[x][y]而不是mat[x*len+y]或者mat+x*len+y)我想我应该使用某种vla或者转换...但似乎强制转换为数组(但我经常返回指针,以及如何使用下标符号如果我不能投射吗?),我可能"可能没有像编译器那样初始化一个可变大小的对象"(即使它不是直接的数组而是指向数组的指针),就像使用这种表示法一样:
int *tab[x][y]=malloc(x*y*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
如果我像3手工一样用常量值替换x和y,我也会得到"无效的初始化器" .
我通过差不多一个星期的搜索,也许这是不可能的,我应该继续前进...我也发现了这个符号,对我来说看起来像函数指针表示法,除非它是一种优先考虑*运算符的方法...
int (*tab)[x][y]=malloc(x*y*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
但是,我并不完全确定理解这种表示法,然后以这种方式从打印/填充数组中获取随机值.
以前我曾尝试使用VLA(可变长度数组)和GNU扩展来提供数组长度作为参数:
void
printMat (int h, int w; int tab[h][w], int h, int w)
{
[code using tab[x][y]]
}
Run Code Online (Sandbox Code Playgroud)
但我很快意识到我需要用指针和malloc来处理一个"添加"函数,添加两个矩阵并返回一个指向新的malloc'ed矩阵的指针......
我特别想知道,如果我不够具体,我应该如何声明参数和返回类型,以便能够将它们用作多维数组而不必使用中间变量,同时实际传递指针(无论如何,这已经是正常的多维数组作为参数做对了吗?)
好吧经过多次测试和尝试后,它现在按照我的意图工作,即使我不确定是否已经很好地理解了所有内容,尤其是指针是什么,什么不是(我可能会因为试图弄清楚gdb这个而感到困惑,我应该进一步调查一下,正常的单维或多维数组是否被gdb视为地址,等等),而今天我的睡眠/休息时间并没有达到最佳状态.
现在,我想对我最初问题的第二部分给出正确答案:如何回归?是否有一个适当的泛型类型(除了无意义void*),它可能被用于指向二维数组的指针(比如int(*)[][]但这会起作用吗?)?如果太通用,什么是投射返回指针的正确方法,所以我可以使用多维下标表示法?是对的(int(*)[3][3])吗?
然而,如果我没有得到任何令人满意的结果(一个合理的 - 足够的"它在C中是不可能的"我猜),我会设置@JohnBod当前的答案来解决问题,因为他通过一个完整的确定了多维vla malloc多维数组的解释性答案,完全回答问题的第一部分,并在第二部分的路径上给出了几个答案(如果有的话).
#include <stdio.h>
#include <stdlib.h>
void
print_mat (int x, int y; int mat[x][y], int x, int y)
{
for (int i = 0; i < x; …Run Code Online (Sandbox Code Playgroud) c arrays pointers multidimensional-array variable-length-array