【问题标题】:c++ error : pointer that points to an arrayc++错误:指向数组的指针
【发布时间】:2020-04-23 12:21:27
【问题描述】:

在 XCode 中它说:线程 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。但我无法运行此代码。我认为当我使用指针时一定有某种错误,但我不知道问题是什么。有人能帮我吗?非常感谢。

【问题讨论】:

  • 你不能那样做。数组不是指针,您正在做的是将m[0] 的第一个元素解释为地址,它们不是
  • 那么你知道如何实现这个代码来初始化这个类吗?
  • 您是否忘记分配“内部”元素? a 的目的是什么(这是无效的 C++)?为什么要搞得这么复杂?
  • @molbdnilo m 是什么?
  • @AsteroidsWithWings 在main中声明。

标签: c++ arrays pointers data-structures


【解决方案1】:

数组不是指针,任何类型的转换都无法改变这一事实。
*(g+i)(即g[i])是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) 更容易关注。

【讨论】:

  • 非常感谢!!!!!!!!!!!!我现在明白我做错了什么。我想我会查看更多关于指针和数组的文章。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2018-03-25
  • 2018-07-29
  • 2013-04-19
  • 2014-04-12
  • 2023-03-11
相关资源
最近更新 更多