2010-12-09 3 views
1
#include <stdio.h> 
#include <stdlib.h> 

typedef struct data { 
    int a, b; 
} Data ; 

struct node { 
    Data info; 
    int priority; 
    struct node *link; 
}; 
typedef struct node* Node; 

void insert(Node header, int pr, Data el) { 
    Node cur = header; 
    Node tmp = malloc(sizeof(struct node)); 
    tmp->info = el; 
    tmp->priority = pr; 
    //descending <= 
    while (cur->link != NULL && pr >= cur->link->priority) 
     cur = cur->link; 
    tmp->link = cur->link; 
    cur->link = tmp; 
} 

Node delete(Node header) { 
    Node tmp; 
    if (header->link == NULL) 
     printf("Empty priority queue"); 
    else { 
     tmp = header->link; 
     header->link = tmp->link; 
     free(tmp); 
     return tmp; 
    } 
} 

void display(Node head) { 
    Node cur = head->link; 
    while (cur != NULL) { 
     printf("%d ", cur->priority); 
     cur = cur->link; 
    } 

} 

int main(int argc, const char *argv[]) 
{ 
    Data d; 
    Node tmp; 
    Node head = malloc(sizeof(struct node)); 
    head->link = NULL; 

    insert(head, 3, d); 

    insert(head, 2, d); 
    insert(head, 1, d); 
while (head->link != NULL) { 

    tmp = delete(head); 
    printf("%d ", tmp->priority); 
} 



    return 0; 
} 

출력은 1 2 3입니다. 그러나 삭제시 메모리 (free (tmp))를 할당 해제 한 다음 tmp를 반환했습니다. 왜 tmp는 여전히 주요 기능에서 인쇄하고 있습니까? gcc 컴파일러 사용은 메모리 위치를 삭제할 수 없습니다.

+3

왜 코드는 이미'free()'된 메모리에 접근하고 있습니까? 'delete()'함수가 왜 처음부터'free()'메모리에 대한 포인터를 리턴합니까? –

+0

부수적으로, 특히 Node typedef가 마음에 들지는 않습니다. 누군가가 당신의 함수 정의만을 살펴 본다면, 당신이 참조가 아닌 값을 전달하는 것처럼 보입니다. 여기서 typedef를 사용하면 가독성이 떨어집니다. 그냥 내 생각을 비록 :) –

+0

@ Demian : 나는 동의하지만 대학에서 내 교수는 똑같은 일을하는 데 사용됩니다. 나는 그것을 싫어하지만 일부 사람들은 typedef에서 포인터를 숨기고 싶어한다. – Lucas

답변

7

delete/free 메모리가 반드시 0 인 것은 아닙니다. 메모리 할당자를 위해 할당 해제 된 것으로 표시 할 수 있습니다. 그런 다음 메모리 할당자는 다시 new/malloc 호출에서 다시 할당 할 수 있습니다. 요점은 메모리 블록을 해제하자마자 액세스하지 말아야한다는 것입니다. 정의되지 않은 동작입니다. 정의되지 않은 동작은 구현/상황에 따라 컴퓨터가 충돌하거나 쓰레기를 반환하거나 이전 값을 반환하거나 become a skynet 등의 컴퓨터를 폭파시킬 수 있음을 의미합니다.

암호화 키/암호와 같은 중요한 정보를 최대한 짧게 메모리에 저장하려면 메모리를 채우기 전에 메모리를 채워야합니다 (예 : Windows의 경우 SecureZeroMemory).

관련 문제