2013-04-18 2 views
0

이것은 약간 까다 롭습니다. 그러나 나는 어쨌든 시도 할 것입니다. 0으로 끝나는 목록을 얻고 중간에 0을 갖는 프로그램을 만들려고합니다. 프로그램은 각 0 사이의 최소값을 확인합니다 (예 : 목록의 경우 6 -> 3 -> 15 -> 0 -> 1 ->2 ->0, 최소 값은 3과 1) 목록에서 삭제하고 다른 목록에 삽입합니다.C 언어로 나열합니다. 액세스 위반

예를 들어, 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; 
} 

많은 변수가 주변에 있기 때문에 작은 설명 : 여기에 내 코드의 결과는리스트 2의 앵커 (최소의 목록)에 대한 포인터를 result_temp은리스트 2의 현재 마지막 항목에 대한 포인터이며, runner는 list1을 반복 할 때 사용하는 포인터입니다. prev_to_runner는 목록에서 주자보다 먼저 항목을 가리키고, prev_to_min은 list1에서 최소값보다 먼저 항목을 가리 킵니다. 예를 들어 6 -> 3 -> 15 -> 0이면 3이 최소이므로 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; 
} 
당신이 32 비트 정수의 크기에 의해 백업 된 NULL 포인터를 가지고 꽤 좋은 단서의

답변

1

Access violation reading location 0xfffffffc. 및 그 다음 그것을 읽으려고 노력했다.

디버거에서 실행하면 위치를 알려줍니다.