c++ - c++错误:指向数组的指针
问题描述
在 XCode 中它说:Thread 1: EXC_BAD_ACCESS (code=1, address=0x3c000003e7)
#include <stdio.h>
#include "Assistance.h"
#define infity 999
using namespace std;
class WeightedDirGraph
{
public:
WeightedDirGraph();
WeightedDirGraph(int **g, int size);
~WeightedDirGraph();
void BellmanFord();
void Display();
protected:
int size;
int (*(*graph));
};
WeightedDirGraph::WeightedDirGraph(int **g, int s)
{
int a[s][s];
graph=(int **)new int *[s];
for(int i=0;i<s;++i)
{
for(int j=0;j<s;++j)
{
printf("%d ",*(*(g+i)+j)); //THIS IS THE LINE OF CODE THAT SEEMS TO BE WRONG
}
cout<<endl;
}
size=s;
}
int main()
{
char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', };
int m[7][7] =
{
{infity, 60, 50, 50, infity, infity, infity},
{infity, infity, infity, infity, -10, infity, infity},
{infity, -20, infity, infity, 10, infity, 70},
{infity, infity, -20, infity, infity, -10, infity},
{infity, infity, infity, infity, infity, infity, 30},
{infity, infity, infity, infity, infity, infity, 30},
{infity, infity, infity, infity, infity, infity, infity}
};
WeightedDirGraph *g=new WeightedDirGraph((int **)m,7);
}
我试图传递一个指向二维数组的指针并初始化这个 WeightedDirGraph。但我无法运行此代码。我认为当我使用指针时一定有某种错误,但我不知道问题是什么。有人能帮我吗?非常感谢。
解决方案
数组不是指针,再多的转换也无法改变这一事实。
*(g+i)
(ie g[i]
) is m[i]
,这是一个int[7]
,而不是一个int*
。
当您将其第一个元素解释为地址时,就会出现欢闹。
您需要从一个指针数组开始,因为它可以转换为指向指针的指针。
只需对代码进行少量更改,它可能如下所示:
int m[7][7] =
{
{infity, 60, 50, 50, infity, infity, infity},
{infity, infity, infity, infity, -10, infity, infity},
{infity, -20, infity, infity, 10, infity, 70},
{infity, infity, -20, infity, infity, -10, infity},
{infity, infity, infity, infity, infity, infity, 30},
{infity, infity, infity, infity, infity, infity, 30},
{infity, infity, infity, infity, infity, infity, infity}
};
int* mp[7] = {m[0], m[1], m[2], m[3], m[4], m[5], m[6]};
WeightedDirGraph *g=new WeightedDirGraph(mp, 7);
更好的解决方案可能是重新考虑您的实现并将数据存储在一维std::vector
.
此外,g[i][j]
比 . 更容易理解*(*(g+i)+j)
。
推荐阅读
- c# - 如何在不涉及用户身份验证的情况下获取 Azure 访问令牌(针对应用程序,而不是用户)?
- angular - 如何在 HTML 中将 base64 显示为可下载链接?
- concurrency - 双核机器上 2+ youtube 视频的并发上下文切换
- ios - Swift UITableView 分隔符隐藏直到滚动
- c - 我可以使用 C 中的 wait(&status) 和循环清理具有相同父级的多个子进程吗?
- angularjs - Angular 中的 GET 请求
- python - 确保 chromedriver 和 google-chrome 在 ubuntu 中的版本相同
- android - 找不到 FCM 令牌
- list - 放入ZStack时swiftui列表不起作用
- html - 尽管我的文件在同一个工作区中,但我在 vs 代码上不断收到“无法打开文件...找不到文件”消息