正在尝试添加到C++中的LinkedList.获得SegFault

Trying to add to a LinkedList in C++. Getting a SegFault

本文关键字:中的 LinkedList 获得 SegFault C++ 添加      更新时间:2023-10-16

所以我试图在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++的新手,所以我的猜测是我用错了指针/引用。

以下是我如何定义股票类别:

#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类的。Account只是一个简单的基类。

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

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