尝试使用数组实现链接列表时,会创建列表,但是在打印数组时会弄乱并打印垃圾值
我已经使用gdb调试了该问题,该阵列在打印之前就已正确形成。一旦我打印了数组,它就会开始打印垃圾值。
int MAX_SIZE=10;
int *head;
int end = -1;
void appendToList(int value){
if (end == -1){
int list[MAX_SIZE] = {0};
head = list;
*(head + end + 1) = value;
end++;
}
else
{
*(head + end + 1) = value;
end++;
}
}
int main(){
appendToList(1);
appendToList(8);
appendToList(3);
appendToList(4);
appendToList(5);
std::cout<< head[0] << "\n";
std::cout<< head[1] << "\n";
std::cout<< head[2] << "\n";
std::cout<< head[3] << "\n";
std::cout<< head[4] << "\n";
return 0;
}
它应该打印“ 1 8 3 4 5”。 输出类似于“ 1 8 0 0 42050”,但这是错误的。
答案 0 :(得分:2)
int list[MAX_SIZE]
是局部变量。它的生命周期一直延伸到声明它的作用域的末尾。在这种情况下,数组不在if语句之外。
head = list
设置静态存储中的指针以指向本地数组。一旦数组被销毁(在if语句块的末尾),指针将不再指向对象。据说是悬空的。
在进一步调用该函数以及在main
中,该程序通过悬空的head
指针进行间接调用,并且该程序的行为未定义。要解决此问题,必须使用其寿命至少可以延长的数组。
当指针/引用/迭代器的生存期比其指向的对象长时,应该始终保持警惕。
P.S。您的数组似乎与链接列表无关。
P.P.S该程序格式错误,因为MAX_SIZE
不是编译时常量表达式。数组的大小必须是编译时间常数。要解决此问题,请声明变量const
或constexpr
。