2011-12-15 3 views
2

나는 그 노드 구조 이제우리에게 약간의 위치로 포인터를 들고 노드의 사용 가능한 메모리를 어떻게

struct node 
    { 
    char *p; 
    struct node *next; 
    }*start; 

아래 주어진 우리가 *는 char p는 malloc에 ​​call.Similarly에 의해 할당 된 메모리 위치에 대한 포인터를 링크 목록을 가지고 전체는 또한 malloc을 사용하여 할당됩니다. 이제

main() 
{ 
    struct node *tmp; 
    tmp=malloc(sizeof(struct node)); 
    tmp->next=NULL; 
    tmp->p=malloc(2*sizeof(int)); 

    free(tmp->p); 
    free(tmp); 

} 

아래에 이런 일이 여기에 필요한 메모리를하거나 뭔가를 올바른 방법인가를 malloc을 호출 모두가 차지하는 공간을 확보 하시겠습니까?

답변

2

이것은 올바른 방법이지만, 포인터를 매달 기 포인터가 될 것입니다 그렇지 않으면 무료로 사용 후 NULL에 포인터를 지정하는 것을 잊지 마세요.

다음과 같이 사용하십시오.

무료 (tmp-> p); tmp-> p = NULL;

+0

그렇습니다. 포인트 tmp-> p-NULL에 대해서는 문제가 없지만, tmp-> p = NULL 명령문을 사용하지 않으면 세그먼테이션 오류가 발생할 가능성이 있습니까? –

+1

아니요이 경우 매달려있는 포인터를 역 참조하지 않으므로 segfault의 가능성이 없습니다. 코드에 매달려있는 포인터가있는 것만으로는 segfault가 발생하지 않습니다. Segfault는 정직한 실수로 인해 매달려있는 포인터를 사용하려고 할 때 발생합니다. 노드를 해제 한 후 노드 내부에서 포인터 p를 역 참조하려고하면 segfault가 발생할 수 있습니다. 이런 식으로 segfault -> free (tmp-> p)가됩니다. * (tmp-> p); // segfault. – Ameliorator

+0

나는이 문장을 인쇄하려고 시도했다. * (tmp-> p) 아직 세그먼테이션 결함 –

0

정상적으로는 첫 번째 노드에 대한 포인터가 있고 포인터를 따라 목록을 반복하지만 자유롭게 해제됩니다. 예 :

struct node *first; 
... list created, first pointing to first in list, where last next is == NULL ... 

while (first != NULL) 
{ 
    struct node* next = first->next; 
    free(first->p); 
    free(first); 
    first = next; 
} 

BTW 왜 char*p를 선언하지만, int 치의을 할당합니까? 오식?

+0

Amelioration에서 만든 포인트를 보았습니까? 포인터를 NULL을 해제 한 후 NULL에 할당 했습니까? 그가 만든 중요한 점을 생각하지 않습니까? –

관련 문제