0

这有点难以解释,但无论如何我都会尝试。我正在尝试创建一个程序,该程序将获得一个以 0 结尾的列表,中间也有 0。该程序将检查谁是每个零之间的最小值(例如:对于 list 6 -> 3 -> 15 -> 0 -> 1 ->2 ->0,最小值是3 和 1) ,将从列表中删除它们,并将它们插入到另一个列表中。

例如,如果 list1 是6 -> 3 -> 15 -> 0 -> 1 ->2 ->0,那么在我运行程序后, list1 将是6 -> 15 -> 0 -> 2 ->0, list2 将是3->1

当我运行我的代码时,我收到访问冲突错误。这是我的代码:

list* essay(list* anchor1)
{
    list* prev_to_min,*runner,*prev_to_runner,*result,*result_temp;
    int min;
    prev_to_min=prev_to_runner=anchor1;
    result=allocate_list();
    result_temp=result;
    runner=prev_to_runner->address_to_next;
    min=runner->number;
    while(runner!=NULL)
    {
        while(runner->number!=0)
        {
            if(min>=runner->number)
            {
                min=runner->number;
                prev_to_min=prev_to_runner;
            }
            prev_to_runner=runner;
            runner=runner->address_to_next;
        }
        remove_item(prev_to_min);
        result_temp=insert_item(result_temp,min);
        prev_to_runner=runner;
        runner=runner->address_to_next;
        if(runner!=NULL)
            min=runner->number;
    }
    return result;
}

一个小的解释,因为周围有很多变量:result 是指向 list2 的锚点(最小值列表)的指针,result_temp 是指向 list2 的当前最后一项的指针,runner 是我用来迭代 list1 的指针, prev_to_runner 是指向 list 中 runner 之前的 item,prev_to_min 是指向 list1 中最小值之前的 item。例如6 -> 3 -> 15 -> 03 是最小值,所以 prev_to_min 是 6 的地址。

我试着用一张纸运行它,在我的脑海中运行程序,我得到了需要的结果。但是当我编译它并且计算机运行它时,我收到错误“更多lists.exe中0x5557700c(msvcr100d.dll)的未处理异常:0xC0000005:访问冲突读取位置0xfffffffc。”

这是插入和删除项目的代码:

void remove_item(list* prev_position)
{
    list* deleted;
    deleted=prev_position->address_to_next;
    prev_position->address_to_next=deleted->address_to_next;
    free(*deleted);
}

list* insert_item(list* position,listdata x)
{
    list* temp=(list*)malloc(sizeof(list));
    temp->number=x;
    temp->address_to_next=position->address_to_next;
    position->address_to_next=temp;
    return temp;
}
4

1 回答 1

1

Access violation reading location 0xfffffffc. 这是一个很好的线索,你有一个 NULL 指针,你备份了一个 32 位整数的大小,然后尝试读取它。

如果你在调试器中运行,它会告诉你在哪里。

于 2013-04-18T11:30:17.653 回答