2013-12-14 2 views
5

나는 다음 코드를 사용하여이 오류가 : 내가 검색 한"해제 된 포인터가 할당되지 않았습니다." malloc에 ​​후 오류, realloc을

int main(){ 
    point *points = malloc(sizeof(point)); 
    if (points == NULL){ 
     printf("Memory allocation failed.\n"); 
     return 1; 
    } 
    other_stuff(points); 
    free(points); 
    return 0; 
} 
void other_stuff(point points[]){ 
    //stuff 
    realloc(points, number*sizeof(point)) 
} 

을하지만 더 할당이 없었다 분명했다 단지 예를 발견했다.

여기서는 malloc을 사용하여 points을 초기화하고 나중에 크기를 realloc으로 변경했습니다. 그래서 내가 어떻게 free에 올 때 "할당되지 않은"포인터입니까?

+0

'points'는'main'에 선언되어 있습니다. 'other_stuff'가 어떻게 접근 할 수 있습니까? – AVP

+0

@AVP 죄송합니다. 편집 됨 (내 코드에 있음) – OJFord

답변

8

realloc은 메모리를 새로운 위치로 이동할 수 있습니다 (이전 포인터를 확장 할 공간이 충분하지 않은 경우). 이런 일이 발생하면 새 포인터를 비워야합니다. 우리는 포인터가 가리키는 곳 이상하지만, 포인터 자체의 주소뿐만 아니라 제어 할 수, other_stuff핸들를 전달하여

int main(){ 
    point *points = malloc(sizeof(point)); 
    if (points == NULL){ 
     printf("Memory allocation failed.\n"); 
     return 1; 
    } 
    other_stuff(&points); 
    free(points); 
    return 0; 
} 
void other_stuff(point **points){ 
    //stuff 
    point *temp = realloc(*points, number*sizeof(point)); 
    if(temp != NULL) { 
     *points = temp; 
     // and do your stuff 
    } 
    else { 
     // panic? memory reallocation failed. Deal with it gracefully. 
    } 
} 

:

이 비틀기를 시도하십시오. 이렇게하면 메모리를 이동할 수 있습니다. 핸들은 메모리를 동적으로 관리하는 좋은 방법입니다. 하지만 개념적으로 포인터를 가리키는 포인터는 익숙해 지는데 ...

+0

-1'realloc'이 실패하면 메모리가 누수됩니다. 'realloc'을 사용할 때 임시로 먼저 지정하고 그 결과를 확인하십시오. –

+0

@ 옙 당신 말이 맞아요. 내 편집이 그렇게 생각합니다. – Floris

+0

Downvote가 제거되었습니다. –

2

realloc 새 포인터를 반환합니다. 은 함수가 성공하면 (결국) 해방해야합니다. 그렇지 않으면, 그것은 실패하고, 당신은이 경우를 대비해 낡은 포인터를 유지합니다.

어떻게 realloc를 사용 :

whataver *f = malloc(count * sizeof(*f)); 
/* ... */ 
whatever *temp = realloc(f, new_count * sizeof(*temp)); 
if (temp) 
    f = temp; // realloc worked, f is no longer valid/needed 
else 
    free(f); // error 

realloc 같은 포인터를 반환 할 수 있습니다, 또는하지 않을 수 있습니다. 요점은 realloc이 성공하면 더 이상 원래 포인터에 관심이 없다는 것입니다. 새 블록을 할당해야한다면 원래 포인터가 유효하지 않습니다. 만약 그렇지 않다면 같은 포인터를 돌려 주었고, 바로 그 할당을 해제하고 싶지는 않을 것입니다.

+0

죄송합니다. 코드의 주 메뉴가 아닌 곳에서 내 OP를 편집했습니다. – OJFord

+0

@OllieFord : 편집으로 문제가 해결되지 않았지만 중요하지는 않습니다. –

+0

그래도 작동한다면 결코 자유롭게 할 필요가 없습니까? – OJFord