【问题标题】:C++ Linked Lists : write access violation errorC++ 链表:写访问冲突错误
【发布时间】:2018-09-18 16:45:14
【问题描述】:

这是一个简单的 C++ 链表程序。我面临的问题是,当我运行我的代码时,它会获取第一个数据,但接下来会显示异常错误。我在 Visual Studio 2017 上运行此代码。我尝试了很多,但无法理解代码的原因无法工作。

#include<iostream>

    using namespace std;

    struct Node {
        int data;
        Node *next;

    }*head = NULL, *temp = NULL , *temp1 = NULL;

    Node* Create_New_Node(int);
    int Insert(Node *);

    Node* Create_New_Node(int a)
    {
        Node *np = new Node;
        np->data = a;
        np->next = NULL;
        return np;
    }
    int Insert(Node *np)
    {
        if (head == NULL) {
            head = np;
            return 0;
         }
        temp1 = head;
        while(temp1 != NULL) {
            temp1 = temp1->next;
        }
        temp1->next = np;

    }
    int main()
    {
        char ch = 'y';
        int inf;
        while (ch == 'y' || ch == 'Y')
        {
            system("cls");
            cout << "Enter data : " << endl;
            cin >> inf;
            temp = Create_New_Node(inf);
            Insert(temp);
            cout << "Press y to continue " << endl;
            cin >> ch;

        }
        system("pause");
        return 0;
    }

这是错误输出:

'Project2.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ucrtbased.dll'. Symbols loaded.
'Project2.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcp140d.dll'. Symbols loaded.
Exception thrown: write access violation.
**temp1** was nullptr.

The program '[10588] Project2.exe' has exited with code 0 (0x0).

由于我是 C++ 链表概念以及 Stack Overflow 的新手,有人可以帮我编写代码吗?无论哪里出错,请纠正我谢谢。

【问题讨论】:

    标签: visual-c++ c++14


    【解决方案1】:

    看看这个循环

    while(temp1 != NULL) { // <---
        temp1 = temp1->next;
    }
    temp1->next = np;
    

    它在temp1 为NULL 时结束,然后您尝试访问next 成员以获取NULL 指针,结果出现分段错误。

    temp1 只能在temp1-&gt;next 不为 NULL 的情况下进行高级,所以可以如下修改你的函数

    while(temp1->next) 
    {
        temp1 = temp1->next;
    }
    

    我们不需要检查temp1 是否不为 NULL,因为从head 节点开始迭代列表,并且temp1 总是通过上述循环中的赋值更新为非 NULL 值。

    【讨论】:

    • 非常感谢@rafix07
    • @EzioThomson 如果这有帮助,请考虑支持并接受此答案作为解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多