2013-04-18 1 views
0

Это немного сложно объяснить, но я все равно попробую. Я пытаюсь создать программу, которая получит список, который заканчивается 0, а также имеет 0 в середине. Программа проверит, кто является минимальным значением между каждым нолем (например: для списка 6 -> 3 -> 15 -> 0 -> 1 ->2 ->0, минимальный значения 3 и 1), удалит их из списка и введет их в другой список.Списки на языке C. Нарушение доступа

Например, если список1 равен 6 -> 3 -> 15 -> 0 -> 1 ->2 ->0, то после запуска программы список1 будет 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; 
} 

Небольшого объяснение, так как есть очень много переменных вокруг: результат является указателем на якорь list2 (список минимумов), result_temp является указателем текущего последнего элемента list2, runner - это указатель, который im использует для перебора по списку1, prev_to_runner - это то, что указывает на элемент перед бегуном в списке, а prev_to_min - это то, что указывает на элемент до минимума в списке1. например, 6 -> 3 -> 15 -> 0, 3 является минимальным, поэтому prev_to_min является адресом 6.

Я попытался запустить его с листом бумаги, запустить программу в моей голове и получить необходимый результат. но когда я его компилирую, и компьютер запускает его, я получаю сообщение об ошибке «Необработанное исключение в 0x5557700c (msvcr100d.dll) в более lists.exe: 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; 
} 

ответ

1

Access violation reading location 0xfffffffc. Это очень хороший признак того, что вы имели указатель NULL, который вы резервируетесь до размера 32-битового целого числа и затем попытался прочитать его.

Если вы запустите в отладчике, он скажет вам где.