VS C语言 二维数组无法在函数中传参

img

这个问题困扰很久了 二维数组无法在函数中传递 其他编译器这样写都没问题 一用就报错 只能使用全局变量 是为什么呢?百思不得其解

void printArr(int** arr, int col, int row) {
    for (int i = 0;i < row;i++) {
        for (int j = 0;j < col;j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}
int main() {
    int a[2][2] = { {1,1},{2,2} };
    printArr(a, 2, 2);
    return 0;
}

arr[m][n]的话
入参改成 arr[][n], int m

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7457306
  • 你也可以参考下这篇文章:VS写C语言报错无法读取内存!
  • 除此之外, 这篇博客: 【C语言】— VS经常函数报错怎么办?中的 解决办法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 我们怎么做呢?

    只需要在程序的第一行加上下面这段代码即可

    #define _CRT_SECURE_NO_WARNINGS 1

    但是问题又来了,我们难不成每一次在写代码之前都要输一段上面屏蔽警告的代码?


  • 以下回答由chatgpt基于相关博客总结生成:

    对于在VS C语言中函数参数二维数组无法传递的问题,可以尝试使用指针来实现二维数组的传递。具体步骤如下:

    1. 声明函数时,将参数定义为指向二维数组的指针类型,例如:
    int func(int (*arr)[N]);
    

    其中,N为数组的第二维大小。

    1. 在函数中对指针进行操作时,可以通过下标访问数组元素。例如:
    int func(int (*arr)[N]) {
        int sum = 0;
        for (int i = 0; i < M; i++) {
            for (int j = 0; j < N; j++) {
                sum += arr[i][j];
            }
        }
        return sum;
    }
    

    其中,M为数组的第一维大小。

    1. 在调用函数时,传入二维数组的地址,即:
    int arr[M][N];
    int result = func(arr);
    

    如果需要在函数中修改数组内容,则需要使用指向指针的指针类型:

    int func(int **arr) {
        // 对指针进行操作
    }
    

    此外,如果使用全局变量来解决该问题,可能存在多个函数同时使用该全局变量时会出现意想不到的错误,建议使用指针传递数组。

在使用C语言进行编程时,我们经常需要使用二维数组来存储和处理大量的数据。然而,在将二维数组作为参数传递给函数时,会遇到一些问题。本文将探讨如何在C语言中传递二维数组,并解决其中的问题。

一、二维数组的传递

在C语言中,我们可以使用指针(Pointer)来传递二维数组。假设我们有一个二维数组a,可以将其传递给函数的方式如下所示:

void func(int (*a)[N], int m) {
    // 执行代码
}

int main() {
    int a[M][N];
    func(a, M);
    return 0;
}


在上面的例子中,我们定义了一个二维数组a,并将其传递给函数func。我们使用指针类型int (*)[N]来表示二维数组a,并将m作为参数传递给函数,以便函数可以知道数组的大小。

二、问题的出现

然而,在实际编程中,我们可能会遇到一些问题。例如,如果我们将二维数组作为函数的参数传递时,会发现数组的第二个维度N必须是已知的常量。也就是说,在定义二维数组时,我们必须指定其第二个维度的大小。这种限制会给代码的编写带来很大的不便。

三、解决方案

为了解决这个问题,我们可以使用指针数组的方式来传递二维数组。指针数组是指一个数组,其中的每个元素都是指向另一个数组的指针。在这种方式下,我们不需要事先指定二维数组的第二个维度大小,可以在运行时动态地分配内存。

例如,我们可以使用以下方式来声明和初始化二维指针数组:

int **a;
a = (int **)malloc(M * sizeof(int *));
for (int i = 0; i < M; i++) {
    a[i] = (int *)malloc(N * sizeof(int));
}


在上面的例子中,我们使用malloc函数动态分配了M个int型指针,并将它们存储在数组a中。然后,我们在循环中分别对每个指针进行另外一次malloc操作,以分配N个int类型的空间。

接下来,我们可以将二维指针数组作为参数传递给函数,方式如下所示:

void func(int **a, int m, int n) {
    // 执行代码
}

int main() {
    int **a;
    a = (int **)malloc(M * sizeof(int *));
    for (int i = 0; i < M; i++) {
        a[i] = (int *)malloc(N * sizeof(int));
    }
    func(a, M, N);
    return 0;
}


在上面的例子中,我们将二维指针数组a作为参数传递给函数func。在函数中,我们需要传递数组的行数m和列数n,以便函数可以正确地访问元素。

四、总结

在C语言中,我们可以使用指针和指针数组来传递二维数组。虽然传递二维数组时存在限制,但是通过使用指针和指针数组,我们可以解决这些限制,并实现动态内存分配和传递二维数组。在编写代码时,需要根据具体情况选择合适的方法。

修改如下,改动处见注释,供参考:

#include <stdio.h>
void printArr(int** arr, int col, int row)
{
    for (int i = 0;i < row;i++) {
        for (int j = 0;j < col;j++) {
            printf("%d ", *((int *)arr + i * row + j)); //修改
            //printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    int a[2][2] = { {1,1},{2,2} };
    printArr((int **)a, 2, 2);    //修改
    return 0;
}