2012-02-01 2 views
0

나는 포인터와 같은 구조가 필요하고 그것을 위해 메모리 할당을 지우고 싶지만 한 번 이상 한 번 이상 문제가 발생할 경우 두려워요. 여기에 내가 무슨 뜻입니다 :구조체 ptrs에 도우미 함수를 사용하는 더 좋은 방법은 무엇입니까?

structptr.h

typedef struct STRUCTPTR STRUCTPTR; 

STRUCTPTR *STRUCTPTR_init(); 

structptr.c

struct STRUCTPTR 
{ 
    char *t1; 
    int t2; 
    float t3; 
    double t4; 
}; 


STRUCTPTR *STRUCTPTR_init() 
{ 
    STRUCTPTR *temp = calloc(4, sizeof (struct STRUCTPTR)); 
    if (!temp) 
    return NULL; 
    return temp; 
} 

main.c를 당신이 올바른 이해한다면, 당신이 만들

#include "structptr.h" 

int main(void) 
{ 
    STRUCTPTR *s = STRUCTPTR_init(); 

    s = STRUCTPTR_init(); 
    return 0; 
} 
+0

STRUCTPTR_init에 대한 첫 번째 호출에서 할당 된 메모리가 손실됩니다. 이것은 메모리 누수입니다. 더 이상 메모리를 올바르게 참조 할 수 없습니다. –

+1

대신에'if (! temp)가 NULL을 반환합니다; return temp;''if (! temp) return temp == NULL? NULL : 임시; NULL == 임시 변수를 반환합니까? 임시 : NULL;'안전합니다. –

+1

짐이 언급 한 메모리 누수 이외에 어떤 문제가 걱정되는지는 명확하지 않습니다. – jamesdlin

답변

1

구조체가 생성되지 않았지만 이미 생성 된 경우 아무 것도하지 않으려 고합니다.

의견에 물어 본 것처럼 포인터를 인수로 사용하여 수행 할 수 있습니다. 함수를 처음 호출하기 전에 먼저 포인터를 NULL으로 설정해야합니다.

STRUCTPTR *STRUCTPTR_init(STRUCTPTR *old) 
{ 
    if (old == NULL) 
     old = malloc(...); 
    return old; 
} 

/* ... */ 

STRUCTPTR *p = NULL; 
p = STRUCTPTR_init(p); 

/* ... */ 

p = STRUCTPTR_init(p); 
관련 문제