我在visual studio和g ++中都遇到了错误我试过gdb但没有从中获得任何有用的东西
visual studio = array2.exe中0x00CD464F处的未处理异常:0xC0000005:访问冲突读取位置0xCCCCCCCC。
gdb给出=程序接收信号SIGSEGV,分段错误。 370.c000000010040118f in list :: append(this = 0x23aa80,x = 6)at main.cpp:61
#include <iostream>
#include <stdlib.h>
// "arraylist.h"
#include <new>
//#include "myList.h"
using namespace std;
struct node{
int data;
node* next;
};
struct list{
node* head;
void append(int x);
};
int main()
{
list L;
L.append(6);
node* cur = L.head;
while (cur->next != 0)
{
std::cout << cur->data << std::endl;
cur = cur->next;
}
return 0;
}
void list::append(int x)
{
node* tmp = new node;
node* cur = head;
tmp->data = x;
tmp->next;
if (cur->data == 0)
{
head = tmp;
}
else{
while (cur->next != 0)
{
cur = cur->next;
}
cur->next = tmp;
}
}
答案 0 :(得分:2)
一些提示:
您没有初始化L.head
(感谢@Alan Stokes)。
您尚未初始化tmp->next
。
cur->data == 0
不是检查列表是否为空的正确方法。
答案 1 :(得分:0)
您的代码无效,因为创建列表对象时未初始化列表的数据成员头
struct list{
node* head;
void append(int x);
};
int main()
{
list L; // <== head is not initialized.
你可以写例如
list L = { 0 };
或者
struct list{
node* head = 0;
void append(int x);
};
答案 2 :(得分:-1)
in
if (cur->data == 0)
{
head = tmp;
}
您正在尝试访问新创建的list
对象的头部,这意味着您正在使用未初始化的指针。这意味着无论何时取消引用它,您都将访问内存中未确定的部分,在这种情况下是您不想访问的部分(这会导致访问冲突错误)。我建议在结构构造函数中使用head
设置NULL
,并在每个尝试访问它的方法中检查head是否为NULL
(在本例中为list::append(int)
)。 / p>
list::list(){
head = NULL;
}
使用list L;