这是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
没有任何区别。怎么会发生这种情况?如何减轻这种崩溃?
答案 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?
}
这样,如果你忘记指定一个指针,你的程序就不会崩溃。