c - 处理通过引用 C 传递的二维数组时出现问题

标签 c arrays multidimensional-array

所以我正在做一项作业,但我无法弄清楚如何使用这个通过引用传递的二维数组。

我得到的是这个

int main(){
//cap and flow initialized 
maximum_flow(1000, &(cap[0][0]), &(flow[0][0]));

}

所以我想将 cap 的内容复制到我动态分配的另一个二维数组中,但在遇到错误后,我决定打印出 cap2capacity< 中的值,我没有取回所有我应该取回的值。

void maximum_flow(int n, int *capacity, int *flow){
    int **cap2;
    cap2 = (int**) malloc(sizeof(int *)*n);
    for (i = 0; i < n; i++)
    {
      cap2[i] = (int*) malloc(sizeof(int)*n);
    }

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {   
          cap2[i][j] = (*(capacity + i*n + j));
          (*(flow + i*n + j)) = 0;
        }
    }
}

最佳答案

这不会是一个非常有用的答案,因为您的代码实际上并没有显示所描述的问题;根据所提供的内容,我看不出明显的原因 capcap2 maximum_flow 末尾不应具有相同的内容功能。但我想提供一些背景知识和建议。

我假设 capflow声明为n通过n int 的数组在main ,其中n在编译时已知。

您的讲师使用此接口(interface)的原因是,在 C 中将多维数组作为函数参数传递是有问题的。请记住,除非它是 sizeof 的操作数。或一元 &运算符,或者是用于在声明中初始化另一个数组的字符串文字,类型为“T 的 N 元素数组”的表达式将被转换(“衰减”)为以下表达式:输入“pointer to T”,表达式的值将是数组第一个元素的地址。

因此,假设声明如下

int cap[10][10];
int flow[10][10];

表达式 capflow每个“衰变”都会输入 int (*)[10] (指向 int 的 10 元素数组的指针)。因此,如果您将函数call编写为

maximum_flow( 1000, cap, flow );

那么函数定义必须写成

void maximum_flow( int n, int (*cap)[10], int (*flow)[10] ) { ... }

void maximum_flow( int n, int cap[][10], int flow[][10] ) { ... }

在函数参数声明的上下文中,T a[][N]T (*a)[N]意思是一样的。

外部维度的大小必须在数组指针声明中指定,问题是指向 10 元素数组的指针是不同的、不兼容> 从指向 10 元素以外的任意值数组的指针类型;因此,maximum_flow只能用于 N x 10 元素数组,限制了它的用途。解决此问题的一种方法是让函数接收指向第一个元素的显式指针,并将该指针视为大小为 N * M 的一维数组。 。

长话短说,由于您将输入参数视为一维数组,因此最好创建 cap2也作为一维数组:

int *cap2 = malloc( sizeof *cap2 * n * n );
...
cap2[i * n + j] = capacity[i * n + j]; // use array subscript notation instead
flow[i * n + j] = 0;                   // of explicit dereferences

从您发布的代码中,不清楚 maximum_flow 是什么应该这样做,也不是为什么你需要 cap2 。另请注意,在某些时候您需要 free分配给 cap2 的内存,否则就会出现内存泄漏。

如果您使用的是 C99 或更高版本的编译器,您应该能够使用可变长度数组而不是 malloc :

int cap2[n * n]; // or int cap2[n][n], but like I said above, if you're 
                 // treating your inputs as 1D arrays, you should also treat
                 // cap2 as a 1D array. 

VLA 的优点是您不需要在编译时知道大小,并且它的处理方式与任何其他 auto 相同。变量,意味着当函数退出时,它的内存将被释放。

VLA 的缺点是您不能将其用作任何局部变量;您不能将 VLA 作为结构或 union 成员,也不能声明 static或在文件范围内。您也不能显式初始化 VLA。

关于c - 处理通过引用 C 传递的二维数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37392484/

相关文章:

c++ - 在 mpi 中定义全局变量

javascript - 有人可以解释一下函数中的一行代码吗

java - 如何正确合并两个已排序的数组?

c - 二维数组元素设置后发生变化

c++ - 指针可以指向4GB之后的地址吗?

编译并运行一串C源代码

编译器行为?

c# - 方法参数数组默认值

Javascript:如何在多维数组上实现迭代器?

android - 如何将二维数组设置为单选按钮?