运行list

时间:2016-01-04 19:09:38

标签: c++ runtime-error

这是我遇到问题的代码的一部分:

#include<iostream>
using namespace std;

struct ID{
    int value;
    ID *nxtElement;
};

struct SqLand{
    ID *id;
    SqLand *next;
};

int main(){

    for(int p, i = 0; i < 3; i++){
        SqLand *nptr = new SqLand;

        cin >> p;
        ID *buff = new ID;
        buff = nptr->id;
        for(int j = 0; j < p; j++){
            cin >> buff->value;
            //cout << "Garbage";
            buff = buff->nxtElement;
        }
        buff = NULL;
        //cout << "WILL";
        delete nptr;
        delete buff;

    }

    return 0;
}

问题是在运行此程序并插入p值大于1时,程序会在再输入2次后退出。 例如,从这样开始:

2
1
3

这是程序退出的地方

如果这两个cout语句都未被注释,则输出为:

2
1
Garbage3
GarbageWILL

另一个:

3
1
Garbage2
Garbage

所有程序在各自的最后一行之后退出。我的程序中有什么错误?它是另一个程序的一部分,所以不要指望这个代码片段有任何意义。我只想知道它出了什么问题。

1 个答案:

答案 0 :(得分:0)

我能从你的代码中理解这一点......(有了修复)

struct ID {
    ID(int val = -1, ID* _nxtElement = NULL) :
            value(val), nxtElement(_nxtElement) {
    }
    int value;
    ID *nxtElement;
};

struct SqLand {
    SqLand(ID* _id = NULL, SqLand* _next = NULL) :
            id(_id), next(_next) {
    }
    ID *id;
    SqLand *next;
};

const int size = 3;
int main() {

    SqLand* head = new SqLand;
    SqLand* tmp = head;
    for (int p, i = 0; i < size; i++) {

        cin >> p;
        tmp->id = new ID;
        ID* tmpID = tmp->id;
        for (int j = 0; j < p; j++) {
            cin >> tmpID->value;

            // avoid unnecessary allocate
            if (j < p - 1) {
                tmpID->nxtElement = new ID;
                tmpID = tmpID->nxtElement;
            }
        }

        // avoid unnecessary allocate
        if(i < size - 1) {
            tmp->next = new SqLand;
            tmp = tmp->next;
        }
    }

    return 0;
}

在您的代码中,您错过了nptr->id的分配,而您错过了最head list SqLand *nptr = new SqLand;的重要内容。