为什么此代码中出现错误错误异常 [重复]

why bad access error exception comes in this code [duplicate]

提问人:Vishwa Mars 提问时间:11/8/2023 最后编辑:user207421Vishwa Mars 更新时间:11/8/2023 访问量:54

问:

为什么我的代码会抛出异常?

该代码定义了一个名为 Graph 的类,该类表示图形。图是由节点和边组成的数据结构。节点表示图形的顶点,边表示节点之间的连接。

Graph 类 具有以下成员:

array:节点数组。 size:图形的大小。 j:用于跟踪数组中下一个可用索引的计数器。 Graph 类提供以下方法:

addvertex():将顶点添加到图形中。 add_edge_no_direction():在图形中的两个顶点之间添加一条无向边。 display():显示图形。 main() 函数创建一个大小为 200 的新 Graph 对象。然后,它将五个顶点添加到图形中,并在顶点之间添加四个无向边。最后,它调用 display() 方法来显示图形

c

#include <iostream>
using namespace std;

struct node {
    int data;
    int weight;
    node* next;
    node() {}
    node(int data, int weight) {
        this->data = data;
        next = nullptr;
        this->weight = weight;
    }
};

class Graph {
private:
    node* array;
    int size;
    int j;

public:
    Graph(int size) {
        this->size = size;
        array = new node[size];
        j = 0;

        for (int i = 0; i < size; i++) {
            array[i].data = 0;
            array[i].weight = 0;
            array[i].next = nullptr;
        }
    }

    bool addvertex(int value) {
        for (int i = 0; i < size; i++) {
            node* current = array[i].next;
            while (current != nullptr) {
                if (current->data == value) {
                    return false;
                } else {
                    current = current->next;
                }
            }
        }

        node* newnode = new node(value, 0);
        newnode->next = nullptr;
        array[j].next = newnode;
        j++;
        return true;
    }

    bool add_edge_no_direction(int source, int destination, int weight) {
        node* newnode1 = new node(source, weight);
        node* newnode2 = new node(destination, weight);

        // check if edge present
        for (int i = 0; i < size; i++) {
            if (array[i].data != source || array[i].data != destination) {
                return false;
            }
        }

        for (int i = 0; i < size; i++) {
            node* current = array[i].next;
            if (current->data == source || current->data == destination) {
                if (current->next == nullptr) {
                    if (current->data == source) {
                        current->next = newnode2;
                    } else {
                        current->next = newnode1;
                    }
                } else {
                    while (current->next != nullptr) {
                        current = current->next;
                    }
                    if (current->data == source) {
                        current->next = newnode2;
                    } else {
                        current->next = newnode1;
                    }
                }
            } else {
                cout << "no way it comes here";
            }
        }
        return true;
    }

  void display(){
  for(int i=0;i<size;i++){
    node* current=array[i].next;
    cout<<current->data;
    while(current){
      cout<<"->";
      current=current->next;
      cout<<current->data;
       
    }
  }
  }
};

int main() {
    Graph g1(200);
   
    g1.addvertex(1);
    g1.addvertex(2);
    g1.addvertex(3);
    g1.addvertex(4);
    g1.addvertex(5);
    g1.add_edge_no_direction(1, 2, 100);
    g1.add_edge_no_direction(1, 3, 150);
    g1.add_edge_no_direction(1, 4, 200);
    g1.add_edge_no_direction(1, 5, 250);
    g1.display();
}

C++ 数据结构 null

评论

0赞 tadman 11/8/2023
PSA:如果可以的话,请使用并避免直接分配。这些都伴随着相当大的责任,你似乎在这里推卸责任,因为你没有合适的析构函数,也没有复制构造函数,这意味着你违反了三法则。std::vectornew[]

答:

1赞 ravenspoint 11/8/2023 #1

如果在调试器下运行代码,则会看到发生异常,因为未检查显示方法中的空指针。

遇到异常时,应始终使用调试器。

调试器是一个非常强大的工具,用于帮助诊断问题 程序。调试器可用于所有实际编程 语言。因此,能够使用调试器被认为是 任何专业或发烧友程序员的基本技能。并使用 调试器本身被认为是您应该自己完成的基本工作 在向他人寻求帮助之前。由于这个网站是为专业人士和 发烧友程序员,而不是帮助台或指导网站,如果你 对特定程序的问题有疑问,但尚未 使用调试器,您的问题很可能被关闭并且 投了反对票。如果你坚持这样的问题,你会 最终被阻止发布更多内容。

固定代码为:

void display()
{
    for (int i = 0; i < size; i++)
    {
        node *current = array[i].next;
        if (!current)
            continue;
        cout << current->data;
        while (current)
        {
            cout << "->";
            current = current->next;
            if (!current)
                break;
            cout << current->data;
        }
    }
}

评论

1赞 ravenspoint 11/8/2023
您是否在调试器下运行了代码?这就是你帮助自己的方式。
0赞 Vishwa Mars 11/8/2023
我也想要这样的显示 1->2->3->4->5 2->1
0赞 ravenspoint 11/8/2023
stackoverflow.com/questions/25385173/......
0赞 Vishwa Mars 11/8/2023
你能发送更正后的代码吗,我已经尝试了 2 次 dat
3赞 ravenspoint 11/8/2023
最后一次:在调试器下运行代码,以便您可以自己修复它。您需要学习如何使用调试器 - 这是一项至关重要的技能。