2016-12-26 156 views
1

嗨我試圖通過程序化編程,使鏈表中CPP在QT,每當我嘗試的東西添加到列表中我得到這個錯誤:QT寫訪問衝突

c:\users\marcin\documents\dev cpp\proc_list\proc_list.cpp:11: error: Exception at 0x13fc325cb, code: 0xc0000005: write access violation at: 0x1, flags=0x0 (first chance)

從什麼我已經讀過這個問題應該是,我嘗試訪問空指針,但試着檢查它,它看起來很好。下面是錯誤代碼:

void append_rec(QString name, int age, int number, float balance, item *first){ 
    item *newrec; 
    item *temp; 

    newrec = new item(this); 
    temp = new item; 

    newrec->next = NULL; 
    newrec->name = name; 
    newrec->number = number; 
    newrec->balance = balance; 
    newrec->age = age; 
    temp = first; 

    while(temp->next!= NULL) 
     temp = temp->next; 

    temp->next = newrec; 
} 

和問題(如調試器說的newrec->next = NULL;線彈出我剛開始學習CPP和嚴重無法找到解決

編輯。

代碼的項目結構(這個任務我不能使用類):

#ifndef PROC_LIST_H 
#define PROC_LIST_H 

#include <qstring.h> 

struct item{ 
    item *next; 
    QString name; 
    int age; 
    int number; 
    float balance; 
}; 

void append_rec(QString name, int age, int number, float balance, item * first); 
void display_list(item * first); 

#endif // PROC_LIST_H 

編輯2

主窗口文件,涵蓋我所做的所有事情與我的清單。

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include "proc_list.cpp" 

item *first = NULL; 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_front_add_clicked() 
{ 
    append_rec(ui->name_edit->text(), 
       ui->age_edit->text().toInt(), 
       ui->accnum_edit->text().toInt(), 
       ui->balance_edit->text().toFloat(), 
       first); 
} 
+0

什麼是threc類型的newrec-> next?你可以分享物品類的代碼嗎? @ tm。 –

+0

@ t.m。是的,完全忘了它:) – Animu

+0

我不確定在C++中是否是這種情況,但在c結構中,如果您在本身使用struct關鍵字,則應該明確地將它寫爲struct。我的意思是,寫下「struct item * next」而不是「item * next」。 –

回答

-1

我注意到的第一件事是你提到了程序編程,然後在函數中使用了「this」指針。只需刪除它。您甚至沒有要使用的「item」結構的構造函數。

其次,你做temp = new item項目,並在你做這個這個temp = first後立即。 BAM內存泄漏。但這不是一個主要問題。

另請注意,您的列表基址指針是從最開始的NULL開始,試圖從您的while引用它的成員temp->next可能會返回垃圾結果,並且可能會將其評估爲true,即使它只是垃圾。 例如STL列表有一個「結束」指針來避免這種事情,你也可以這樣做。 希望我幫助!

編輯:

嗯,我設法解決純C++的問題,但我可能已經做到了過於複雜。 我選擇使用指針指針,因爲當列表爲空時,我們將能夠通過參數更改基指針。但我不認爲這是最佳的解決方案,但它的工作原理。請注意,您現在需要在從main調用時傳遞該項目的地址。

#include <iostream> 

using namespace std; 

struct item{ 
    item *next; 
    string name; 
    int age; 
    int number; 
    float balance; 
}; 

void append_rec(string name, int age, int number, float balance, item** first){ 
    item *newrec = new item; 

    newrec->next = NULL; 
    newrec->name = name; 
    newrec->number = number; 
    newrec->balance = balance; 
    newrec->age = age; 

    while(*first!= NULL) // The pointer we are pointing to isnt valid 
     first = &(*first)->next; // Point to the next pointer in the list 

    *first = newrec; // Change the value of the pointer we are pointing to 
} 
void display_list(item * first) 
{ 
    item* temp = first; 
    while (temp != nullptr) 
    { 
     cout << temp->name << '\n'; 
     cout << temp->number << '\n'; 
     cout << temp->balance << '\n'; 
     cout << temp->age << '\n'; 
     cout << "<===================||=======================>"; 

     temp = temp->next; 
    } 
} 

item *first = NULL; 
int main() 
{ 
    append_rec("something 1", 1, 1, 1.f, &first); 
    append_rec("something 2", 2, 2, 2.f, &first); 
    append_rec("something 3", 3, 3, 3.f, &first); 
    append_rec("something 4", 4, 4, 4.f, &first); 

    display_list(first); 
} 
+0

我必須承認我沒有看到這個問題,但修復了它,但它仍然給我錯誤。它出現在11行,當我想分配名稱到newrec->名稱 – Animu