C ++程序在读取NULL引用时崩溃

时间:2015-07-25 19:16:19

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

这是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没有任何区别。怎么会发生这种情况?如何减轻这种崩溃?

3 个答案:

答案 0 :(得分:4)

Line *GeorgiaCyclone;

这会创建指向Line的指针,但不会为其指定Line。您需要为其分配Line的地址:

Line *GeorgiaCyclone = new Line

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

Line GeorgiaCyclone;

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

答案 1 :(得分:1)

未初始化的非静态局部变量具有 indeterminate 值,实际上看似随机且很少等于空指针。

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

我正在谈论的变量当然是main函数中的变量。

在一个不相关的说明中,在C ++中,你不应该使用NULL作为空指针;使用nullptr(首选,但仅限C ++ 11和更高版本的编译器)或0。在C ++中,NULL是一个扩展为0的宏。

答案 2 :(得分:0)

你应该始终初始化指针,否则行为是未定义的......如果你想让它为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?
}

这样,如果你忘记指定一个指针,你的程序就不会崩溃。