【问题标题】:C++ program crashes upon reading NULL referenceC++ 程序在读取 NULL 引用时崩溃
【发布时间】:2015-10-16 06:53:43
【问题描述】:

这是 C++ 中的链接结构。这里的所有变量和对象都应该有定义的地址。但是,执行中却另有说明。

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
struct LineData {
    int ID;
    char name[33];
    LineData *next;
};

class Line {
    private:
        LineData *pointerHead;
        LineData *pointerToTail;
        int numObjects;
    public:

        Line();
        ~Line();

        void enterLine(int ID, char *data);
        void enterLine(LineData *lindat);
        LineData *exitLine();
        int count();
};

Line::Line() {
    pointerHead = NULL;
    pointerToTail = NULL;
    numObjects = 0;
    /*pointerHead = NULL;
    pointerToTail = NULL;*/
}

/** Puts an item into the line. **/
void Line::enterLine(int ID, char *data) {

    LineData *temp;
    cout << "Inner sanctums called.\n";
    temp = new LineData;
    temp->ID = ID;
    strcpy(temp->name, data);
    temp->next = NULL;
    cout << "Temp created.\n\n";
    //cout << "pointerHead is... ... " << pointerHead << "!\n"; Not going to work!
    /* Insert into the Line */
    if(pointerHead != 0) {  /* Insert as first in this Line/You shall not pass! Program will not let you pass! BOOM! Crash! */
        cout << "If tried.\n";
        pointerToTail->next = temp;
        pointerToTail = temp;
    }
    else /* Insert at Tail of the Line */
    {
        cout << "pointerHead == NULL. What are you going to do about it?\n";
        cout << temp->ID << "\n";
        pointerHead = temp;
        pointerToTail = temp;
        cout << "Inserted into Line!\n";
    }
}

/** ......
    ......
  ..........
  ..........
    ...... **/

正确编译。

int main() {
    Line *GeorgiaCyclone;
    Line *GiletteIce; // Shaved Ice.
    Line *WoodenMagic;
    Line *SteelCityNinja;
    Line *Egbe; // Hawk.

GeorgiaCyclone->enterLine(4, "Preston");
Egbe->enterLine(2, "Felix");


return 181;
}

每行的地址在创建时设置为 NULL。使用this 并没有什么不同。这怎么可能发生?如何缓解这种崩溃?

【问题讨论】:

  • “链接结构”?
  • “这里所有的变量和对象都应该有定义的地址。” 什么对象?从字面上看,您的顶级指针都没有指向任何东西。

标签: c++ pointers linked-list null queue


【解决方案1】:
Line *GeorgiaCyclone;

这会创建一个指向Line 的指针,但不会创建一个指向它的Line。你需要给它分配一个Line的地址:

Line *GeorgiaCyclone = new Line

更好的是,您可以完全避免在 main() 中使用指针:

Line GeorgiaCyclone;

您在main() 中声明的所有其他Line*s 也是如此。

【讨论】:

  • 啊。我原以为一旦在入队函数中创建了temp,地址就可以引用temp。我也误解了别人的一些指示。它工作正常。
【解决方案2】:

未初始化的非静态局部变量有一个不确定的值,实际上看起来是随机的,很少等于空指针。

取消引用未初始化的指针,或实际读取任何未初始化的变量,会导致未定义的行为

我说的变量当然是你main函数中的变量。


另外,在 C++ 中,您不应该将 NULL 用于空指针;使用 nullptr(首选,但仅在 C++11 和更高功能的编译器中)或 0。在 C++ 中,NULL 是一个扩展为 0 的宏。

【讨论】:

    【解决方案3】:

    您应该始终初始化指针,否则行为未定义...如果您希望指针为 NULL,则必须将指针初始化为 NULL。但是,取消引用 NULL 指针仍然未定义的行为,但至少您可以检查它是否为 NULL。养成初始化一切的习惯是件好事。

    Line *GeorgiaCyclone = NULL;    
    if(GeorgiaCyclone!=NULL)GeorgiaCyclone->enterLine(4, "Preston");
    else{//some code that alerts you to the fact that you have null pointers, perhaps a message box?
    }
    

    这样,如果您忘记分配指针,您的程序就不会崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 2015-07-12
      • 2020-03-28
      • 1970-01-01
      相关资源
      最近更新 更多