0

これを説明するのは少し難しいですが、とにかくやってみます。0 で終わり、途中に 0 があるリストを取得するプログラムを作成しようとしています。プログラムは、各ゼロの間の最小値が誰であるかをチェックします (たとえば、 list6 -> 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 はリストのランナーの前の項目を指し、prev_to_min は list1 の最小値の前の項目を指します。たとえば6 -> 3 -> 15 -> 0、3 が最小値であるため、prev_to_min は 6 のアドレスです。

私は一枚の紙でそれを実行しようとし、頭の中でプログラムを実行しましたが、必要な結果が得られました。しかし、それをコンパイルしてコンピューターで実行すると、「more 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. これは、32 ビット整数のサイズでバックアップした NULL ポインターを持っていて、それを読み取ろうとしたというかなり良い手がかりです。

デバッガーで実行すると、場所がわかります。

于 2013-04-18T11:30:17.653 に答える