2013-03-26 3 views
0

curr->data에 데이터를 입력 할 때 우선 curr = (NODE*) malloc (sizeof(NODE));을 수행하여 메모리를 할당합니다. 그런 다음 목록을 작성하고 결국 결국 인쇄하십시오. 프로그램의 어딘가에서 내가 사용한 기억을 자유롭게해야하지만, 언제해야할지 모른다. 목록을 작성한 후 또는 목록을 인쇄 한 후에? 아니면 내가 할 수 있을까?링크 된 목록의 노드를 해제하는 경우

printf("How many elements do you want to make? "); 
scanf("%d", &NumElem); 
head = NULL; 
for (i = 0; i < NumElem; i++) 
{ 
    //memory allocate 
    curr = (NODE*)malloc(sizeof(NODE)); 
    printf("Number %d: ", i+1); 
    scanf("%d", &curr->num); 
    FLUSH; 

    if (head == NULL)/*beginning of the list*/ 
    { 
     curr->next = head; 
     head = curr; 
     *tail = curr; 
    } 
    else /*adding on the list*/ 
    { 
     curr->next = head; 
     head = curr; 
    } 
    free (curr); 
}//for 

데이터를 현재 노드에 넣은 후 매번 해제 할 수 있습니까?

+1

* 사용 * 완료 *. 이 경우 루프 사용을 마친 경우에도 사용하지 않은 것입니다. '자유'로 설정하면 '꼬리'와 '머리'(예 :)는 이제 개체가 '무료'일 때 정크를 가리 킵니다. –

+1

내용을 알 수 없으므로 해제 한 메모리는 다시 참조 할 수 없습니다. 목록을 가지고 무엇을해야하고 (내가 생각한대로 인쇄 한 후) 목록을 탐색하여 길을 따라 각 노드를 자유롭게 만듭니다. –

+0

아주 중요 : 'FLUSH;'란 무엇입니까? – Sebivor

답변

6

회의가 있고 그 다음 파티가 예정된 지역 회의실이 예약되어 있다고 가정합니다. 언제 예약을 했습니까? 예약 한 직후, 회의가 끝난 후, 파티를하기 전에, 또는 회의와 파티를 모두 마친 후에는 예약을 언제 풀어 주겠습니까?

mallocfree 그렇게입니다 ... malloc는 사용할 메모리의 영역을 보유하고 free는 예약을 취소합니다. 예약을 취소 한 후에도 계속 메모리를 사용하면 동작은 정의되지 않습니다.

귀하의 경우 전체 노드 목록을 비워야합니다. 루프를 사용하여 수행 할 수 있지만 일반적인 함정은 노드 next 포인터에 액세스하기 전에 노드를 해제하는 것입니다. 위험은 거의 항상 실제로 작동하지만, 정의되지 않았으며 때로는 작동하지 않을 수도 있습니다 ... 생명을 위협하는 기계를 제어하는 ​​일부 소프트웨어에서 가능할 수도 있습니다. 최저 지금 그것을 할 배울 수 :

void free_list(NODE* list) 
{ 
    while (list) 
    { 
     NODE* next = list->next; 
     free(list); 
     list = next; 
    } 
} 

또는 약간 더 컴팩트 한 형태로

,

void free_list(NODE* list) 
{ 
    for (NODE* next; list; list = next) 
    { 
     next = list->next; 
     free(list); 
    } 
} 

노드가 malloc 편이었다 문자열 또는 다른 개체에 대한 포인터를 포함하고 해제 할 필요가있는 경우 그 무료 통화는 노드 자체를 해제하기 전에 free_list에서 수행됩니다.

관련 문제