在 C/C++ 中传递二维数组时出错

Posted

技术标签:

【中文标题】在 C/C++ 中传递二维数组时出错【英文标题】:Error in Passing 2d Array in C/C++ 【发布时间】:2014-12-31 18:50:06 【问题描述】:

我收到错误:

无法将 int** 转换为 int*[5]...

在我的代码中。我知道如何将二维数组传递给函数,但我被困在这里。

代码用于邻接矩阵上的深度优先遍历。

    #include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

#define m 5
#define n 5

void dfs(int G[][n],int i,int visited[])

     visited[i]=1;
     int j;
     for(j=0;j<n;j++)
     
         if(!visited[j]&&G[i][j]==1)
                     dfs(G,j,visited);
     


int main()
   int r,c,i;
    printf("Enter Dimensions\n");
    scanf("%d %d",&r,&c);
    r = m; c = n;
    int **G = (int **)malloc(r*sizeof(int*));
    for(i=0;i<r;i++)
    
        G[i] = (int *)malloc(c*sizeof(int));
    
    printf("Enter the Matrix\n");
    int j;

    for(i=0;i<r;i++)
        for(j=0;j<c;j++)
          scanf("%d",G[i][j]);
    int *visited = (int*)malloc(r*sizeof(int));
    memset(visited,0,sizeof(visited));

    dfs(G,0,visited);


【问题讨论】:

在 c++ 中,使用std::vector void dfs(int G[][n],int i,int visited[])更改为void dfs(int* G[],int i,int visited[]) memset(visited, 0, sizeof(visited)) 错了,scanf("%d", G[i][j]) 也是。还有你在读rc 干什么? 不要转换malloc()的返回值。另外,c++new。好好利用它。 选择您的语言 C 或 C++。 【参考方案1】:

我认为你需要的是这个,它是一个 c 解决方案,如果你想要 c++,你应该使用 std::vector 代替。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

using namespace std;


void dfs(int **G, int i, int *visited, int c)

    int j;

    visited[i] = 1;
    for(j = 0 ; j < c ; j++)
    
        if((visited[j] == 0) && (G[i][j] == 1))
            dfs(G, j, visited, c);
    


int main()

    int   r, c, i, j;
    int **G;
    int  *visited;

    printf("Enter Dimensions\n");
    scanf("%d %d", &r, &c);

    G = malloc(r * sizeof(*G));
    if (G == NULL)
        return -1;
    visited = malloc(r * sizeof(*visited));
    if (visited == NULL)
    
        free(G);
        return -1;
    
    memset(visited, 0, r * sizeof(*visited));

    printf("Enter the Matrix\n");
    for(i = 0 ; i < r ; i++)
    
        G[i] = malloc(c * sizeof(**G));
        if (G[i] == NULL)
        
            for (j = i - 1 ; j >= 0 ; --j)
                free(G[j]);
            free(G);

            return -1;
        
        for(j = 0 ; j < c ; j++)
            scanf("%d", &(G[i][j]));
    
    dfs(G, 0, visited, c);

    /* now free */
    free(visited);
    for(i = 0 ; i < r ; i++)
        free(G[i]);
    free(G);

    return 0;

这也可以是一个 c++ 解决方案

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

void dfs(int **G, int i, int *visited, int c)

    int j;

    visited[i] = 1;
    for(j = 0 ; j < c ; j++)
    
        if((visited[j] == 0) && (G[i][j] == 1))
            dfs(G, j, visited, c);
    


int main()

    int   r, c, i, j;
    int **G;
    int  *visited;

    printf("Enter Dimensions\n");
    scanf("%d %d", &r, &c);

    G       = new int*[r];
    visited = new int[r];

    memset(visited, 0, r * sizeof(*visited));

    printf("Enter the Matrix\n");
    for(i = 0 ; i < r ; i++)
    
        G[i] = new int[c];
        for(j = 0 ; j < c ; j++)
            scanf("%d", &(G[i][j]));
    
    dfs(G, 0, visited, c);

    /* now free */
    delete[] visited;
    for(i = 0 ; i < r ; i++)
        delete[] G[i];
    delete[] G;

    return 0;

最后是std::vector

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>

using namespace std;
void dfs(const vector< vector<int> > &G, int i, vector<int> &visited)

    size_t j;

    visited[i] = 1;
    for(j = 0 ; j < visited.size() ; j++)
    
        if((visited[j] == 0) && (G[i][j] == 1))
            dfs(G, j, visited);
    


int main()

    int r, c, i, j;


    printf("Enter Dimensions\n");
    scanf("%d %d", &r, &c);

    vector< vector<int> > G(r, vector<int>(c));
    vector<int>           visited(r, 0);

    printf("Enter the Matrix\n");
    for(i = 0 ; i < r ; i++)
    
        for(j = 0 ; j < c ; j++)
            scanf("%d", &(G[i][j]));
    
    dfs(G, 0, visited);

    return 0;

【讨论】:

【参考方案2】:

我认为错误部分是函数定义:

你应该这样写:

void dfs(int *G[],int i,int visited[])

与其赋予第二维度价值,不如保持它如图所示。

或者你也可以这样写:

void dfs(int **G,int i,int *visited)

其他一切都很好。

【讨论】:

以上是关于在 C/C++ 中传递二维数组时出错的主要内容,如果未能解决你的问题,请参考以下文章

将二维数组传递给 double function_name 时出错

C++:使用函数为二维数组分配内存时出错

x86 MASM - 传递和访问二维数组

C语言中如何将二维字符数组作为函数参数引用传递

JNI内两种方式从C/C++中传递一维二维三维数组数据至Java层详细梳理

c语言中怎么用二维数组作为函数参数