我的C++程序可以运行,但总是弹出错误

My C++ program can run but always pop up error

本文关键字:出错 错误 程序 C++ 运行 我的      更新时间:2023-10-16

这是我的代码:

GraphBuilder.h

//#pragma once
#include<iostream>
#include<stdio.h>
#include<fstream>
#include <stdlib.h>
#include <string>
using namespace std;
#define MaxVertexNum 500000    
struct Node{
    int data;
    struct Edge *next;
};
struct Edge{
    int data;
    int weight;
    struct Edge* next;
};

class GraphBuilder
{
public:
    GraphBuilder();
    void CreateGraph();
    void printGraph();
    Node *header;
    int total_of_nodes, total_of_edges;
private:
};

GraphBuilder.cpp

#include"GraphBuilder.h"
using namespace std;
GraphBuilder::GraphBuilder()
{
}
void GraphBuilder::CreateGraph()
{
    int i,j,k;
    int vex1, vex2, weight;
    char a;
    Edge *tmp, *newNode;     
    FILE *fp;
    int line= -1;
    fp = fopen("Text1.txt", "r");

    if(fp == NULL)
    {
        cout<<"Cannot open file!n";
        return;
    }
    while(!feof(fp))
    {
        if(line == -1)
        {
            fscanf(fp, "%d %d", &total_of_nodes, &total_of_edges);    
            line++;
        }
        else break;
    }
    for(i=0;i<total_of_nodes;i++) 
    {
        header[i].data = i;   
        header[i].next = NULL;
    }    
    while(!feof(fp))
    {
        if(line == -1)
        {
            fscanf(fp, "%d %d", &total_of_nodes, &total_of_edges);  
            line++;
        }
        else
        {
            fscanf(fp, "%d %d %d", &vex1, &vex2, &weight);    
            newNode = (Edge *)malloc(sizeof(Edge));   
            newNode->data = vex2;          
            newNode->weight = weight;
            newNode->next = NULL;
            if (header[vex1].next == NULL)
                header[vex1].next = newNode;   
            else 
            {
                tmp = header[vex1].next;
                header[vex1].next = newNode;
                newNode->next = tmp;
            }
        }
    }
}
void GraphBuilder::printGraph()
{
    int i;
    Edge* tmp;
    for (i=0; i<total_of_nodes; i++)
    {
        cout<<header[i].data;
        if (header[i].next != NULL)
        {
            tmp = header[i].next;
            cout<<"->"<<tmp->data;
            while (tmp->next != NULL)
            {
                cout<<"->"<<tmp->data;
            }
        }
        cout<<endl;
    }
}

main.cpp

#include"GraphBuilder.h"
using namespace std;
void main()
{
    GraphBuilder gb;
    gb.CreateGraph();
    gb.printGraph();
}

我在VS2012上运行代码,它总是弹出发生访问冲突的错误。我不知道为什么会出现这个错误,我是C++的大一新生。请告诉我如何更正我的代码。谢谢你的帮助。

您的编译器没有警告您吗?

const int total_of_nodes = 0, , total_of_edges = 0;

fscanf(fp, "%d %d", &total_of_nodes, &total_of_edges);

这不太好。您正在修改const对象,它是未定义的行为。

您的访问违规问题来自于访问您的头数组而之前没有为其分配空间:

for(i=0;i<total_of_nodes;i++) 
    {
        header[i].data = i;   
        header[i].next = NULL;
    } 

使用动态分配方式:

Node *header;
...
header=(Node*) malloc(SIZE*sizeof(Node));

或者

Node *header = new Node[SIZE];

或者使用静态分配您的头

Node *header[SIZE];

似乎从未分配过header

除非我错过了,否则您似乎还没有初始化您的"header"变量,所以

for(i=0;i<total_of_nodes;i++) 
{
    header[i].data = i;   
    header[i].next = NULL;
}

可能会导致一些错误,因为标头[i]可能指向任何位置。。。

您必须初始化标题列表。

您应该在使用指针之前分配它,否则即使程序可以成功编译,也会出现运行时错误。

相关文章: