2017-03-19 1 views
0

목록을 사용하고 목록의 두 번째 차원에 동적으로 메모리를 할당하고 해당 구조체를 채우는 특정 숙제 기능을 사용하여 다음 구조체를 사용하여 다소 어려움을 겪고 있습니다.2d 연결된 목록 메모리가 옮겨지지 않음

13 typedef struct BookIds{ 
    14  int id; 
    15  struct BookIds* next; 
    16 }bookIds; 
    18 typedef struct Student{ 
    //Unimportant struct elements 
    23  bookIds* wishlist; 
    24  struct Student* next; 
    25 }student; 

하고

void addWishlist(student* head, char* wishListfile) { 
//cannot modify parameters or return type 
191  FILE* f = fopen(wishListfile, "r"); 
192  student* current = head; 
193  int i; 
194  int* wish = malloc(sizeof(int) * 4); 
195  while (current != NULL) { 
196   current->wishlist = malloc(sizeof(bookIds)); 
197   fscanf(f, "%d %d %d %d", (wish), (wish+1), (wish+2), (wish+3)); 
198   for (i = 0; i < 4; i++) { 
199    current->wishlist->id = *(wish+i); 
200    current->wishlist->next = malloc(sizeof(bookIds)) 
201    current->wishlist = current->wishlist->next; 
202   } 
203   current = current->next; 
204  } 
205  free(wish); 
206  fclose(f); 
207 } 

문제를 호출하는 함수를 호출 한 후, 제 2 어레이리스트 메모리 (모든 소자가 NULL이다)이 발에 의해 패스 때문에 손실이다. 일반적으로 목록을 반환하거나 이중 포인터를 매개 변수로 사용하도록 선택 하겠지만이 할당에 대한 옵션은 아닙니다. 모든 도움/프로그래밍 조언을 많이 주시면 감사하겠습니다.

+0

'new_node = malloc (sizeof (* new_node))와 같은 링크를 만듭니다;/* new_node의 멤버를 설정합니다 */new_node-> next = list_holder; list_holder = new_node;'또한'list_holder'는 NULL로 시작합니다. – BLUEPIXY

답변

1

문제는 함수 호출 한 후, 제 2 어레이리스트 메모리 (모든 소자가 NULL이다)이 발에 의한 패스 손실 때문이다.

함수에 전달 된 인수가 함수 내에서 변경되지 않으므로 여기에는 문제가 없습니다.

대신, 나는 당신의 문제에 대해 생각 : 것 같다

198   for (i = 0; i < 4; i++) { 
199    current->wishlist->id = *(wish+i); 
200    current->wishlist->next = malloc(sizeof(bookIds)) 
201    current->wishlist = current->wishlist->next; 
202   } 

는 4 개 요소를 포함하도록 wishlist을 원하지만 라인 (201)에 당신이 체인의 마지막 요소를 가리 키도록 current->wishlist을 변경합니다. 그래서 당신은 하나의 초기화되지 않은 요소로 끝납니다.

당신은 요소의 간단한 도면 및 포인터함으로써이 문제를 볼 수 있습니다

enter image description here

당신이 볼 수 있듯이을, 당신은

언제 라인 (201)을 실행 한 후 첫 번째 요소를 잃었다

enter image description here

당신은 근래 : 함수는 다음과 같습니다, 완료 e는 마지막 요소를 제외한 모든 요소를 ​​잃었습니다 (btw는 초기화되지 않았습니다).

따라서 위의 행을 다시 작성하여 current->wishlist 행 201을 변경하지 않아야합니다. 또한 마지막 next 포인터를 NULL로 설정해야합니다. BTW

 fscanf(f, "%d %d %d %d", (wish), (wish+1), (wish+2), (wish+3)); 
    bookIds* p; 
    for (i = 0; i < 4; i++) { 
      if (i == 0) { 
       current->wishlist = malloc(sizeof(bookIds)); 
       p = current->wishlist; 
      } else { 
       p->next = malloc(sizeof(bookIds)); 
       p = p->next; 
      } 
      p->id = = *(wish+i); 
      p->next = NULL; 
     } 

:

은 아마 당신은 같은과 라인 196-202을 대체 할 수 또한 mallocfscanf이 성공적이기 위해 검사를 추가해야합니다.

+0

당신은 생명의 은인입니다. 내가 gdb에서 얻은 것과 일치하는 설명과 함께 출력 해 주신 것에 대해 감사드립니다. 하지만 당신이 묻는 것에 신경 쓰지 않는다면 왜 "current-> wishlist = current-> wishlist-> next"라는 코드가 다음 요소가 아닌 마지막 요소를 가리키고 있는가? –