试图在C ++中添加到链接列表。获得SegFault

时间:2013-12-02 23:07:44

标签: c++ class linked-list segmentation-fault

所以我试图在c ++中添加一个链接列表,但由于某种原因我一直在使用SegFault。

Stock是将成为LinkedList的类,StockAccount是将访问它的类。

我插入数据的方式是它通过文件行购买行并解析当前行的信息并将其插入列表中。

这是我用来添加到列表中的代码:

void StockAccount::addStock(string sN, double sP) {


    Stock *temp, *temp2;

    temp->StockName = sN;
    temp->StockPrice = sP;
    temp->next = NULL;

    if (myHead == NULL) {
        myHead = temp;
    } else {
        temp2 = myHead;
        while (temp2->next != NULL) {
            temp2 = temp2->next;
        }
        temp2->next = temp;
    }

}

SegFault似乎发生在我定义的行

temp->StockName=sN;

我是c ++的新手,所以我的猜测是我使用指针/引用错误。

以下是我定义Stock类的方法:

#include <string>

using namespace std;
using std::string;

class Stock {
    friend class StockAccount;
public:

    Stock() {
    }

    Stock(string name, double price) : StockName(name), StockPrice(price) {
        this->next = NULL;
    }

private:

    string StockName = "";
    double StockPrice = 0;
    Stock *next;


};

以下是我定义StockAccount类的方法。帐户只是一个简单的基类。

class StockAccount : public Account {
    friend class Account;

public:



    StockAccount();


    void addStock(string sN, double sP);
private:
    Stock *myHead;
    Stock *myTail;

};

并执行它:

StockAccount::StockAccount() {
    vector<string> temp;
    string line;
    std::ifstream stockfile("Results.txt");
    if (stockfile.is_open()) {
        while (stockfile.good()) {


            getline(stockfile, line);
            istringstream ss(line);
            string token;
            while (std::getline(ss, token, ',')) {
                temp.push_back(token);
            }

            //*stck = new stock(token.at(0), atof(temp.at(1)));

            addStock(temp.at(0), atof(std::string(temp.at(1)).c_str()));
            temp.clear();

        }
        stockfile.close();
    } else {
        cout << "Unable to open file" << std::endl << std::endl;
    }

}
//http://www.codeproject.com/Articles/24684/How-to-create-Linked-list-using-C-C

void StockAccount::addStock(string sN, double sP) {


    Stock *temp, *temp2;

    temp->StockName = sN;
    temp->StockPrice = sP;
    temp->next = NULL;

    if (myHead == NULL) {
        myHead = temp;
    } else {
        temp2 = myHead;
        while (temp2->next != NULL) {
            temp2 = temp2->next;
        }
        temp2->next = temp;
    }

}

1 个答案:

答案 0 :(得分:1)

变量temp未初始化。通过执行temp->StockName = sN;,您实际上是在尝试取消引用无效指针,这当然会给您一个分段错误。

您需要做的是在尝试对其执行任何操作之前,通过执行stock来分配Stock *temp = new Stock();对象。