链表的数组实现

时间:2019-07-15 11:14:14

标签: c++ arrays linked-list

尝试使用数组实现链接列表时,会创建列表,但是在打印数组时会弄乱并打印垃圾值

我已经使用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”,但这是错误的。

1 个答案:

答案 0 :(得分:2)

int list[MAX_SIZE]是局部变量。它的生命周期一直延伸到声明它的作用域的末尾。在这种情况下,数组不在if语句之外。

head = list设置静态存储中的指针以指向本地数组。一旦数组被销毁(在if语句块的末尾),指针将不再指向对象。据说是悬空的。

在进一步调用该函数以及在main中,该程序通过悬空的head指针进行间接调用,并且该程序的行为未定义。要解决此问题,必须使用其寿命至少可以延长的数组。

当指针/引用/迭代器的生存期比其指向的对象长时,应该始终保持警惕。


P.S。您的数组似乎与链接列表无关。

P.P.S该程序格式错误,因为MAX_SIZE不是编译时常量表达式。数组的大小必须是编译时间常数。要解决此问题,请声明变量constconstexpr