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

时间:2013-08-22 10:20:25

标签: c++ pointers

这是我的代码:

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上运行代码,它总是弹出发生Access违规的错误。我不知道为什么会出现这个错误,我是C ++的新生。请告诉我如何更正我的代码。 谢谢你的帮助。

5 个答案:

答案 0 :(得分:5)

你的编译器不警告你吗?

const int total_of_nodes = 0, , total_of_edges = 0;

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

这不可能是好事。你正在修改const对象,它是未定义的行为。

答案 1 :(得分:4)

您的访问冲突问题来自访问您的标头数组而不为之前分配空间:

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];

答案 2 :(得分:3)

似乎永远不会分配header

答案 3 :(得分:2)

除非我错过了,否则你似乎没有初始化你的“标题”变量,所以

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

可能会导致一些错误,因为header [i]可能指向任何地方......

您必须初始化标题列表。

答案 4 :(得分:1)

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