在 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])
也是。还有你在读r
和c
干什么?
不要转换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 时出错