2016-07-17 5 views
1

현재 동적 메모리 관리가 어떻게 작동하고 있는지, 특히 realloc이 어떻게 기능에서 수행되는지 배우고 있습니다.C - realloc이 메인으로 돌아 가지 않음

다음 프로그램에서는 malloc을 사용하여 a() 함수에서 일부 숫자를 할당하고 다른 함수 b()로 전달하려고합니다. b()에서 포인터의 주소를 c()에 전달하여 크기를 두 배로 재 할당하고 숫자로 초기화합니다.

이제 내 질문에 오는 : 함수 b()의 출력이 올바른 숫자를 나타내는 이유는 무엇입니까?하지만 주 기능에서는 그렇지 않습니다. 메인의 포인터 "numbers"도 재 할당 된 메모리를 가리켜 야하지 않습니까?

미리 감사드립니다.

코드 :

#include <stdlib.h> 
#include <stdio.h> 

#define SIZE 3 

int a(int **numbers); 
int b(int *numbers); 
int c(int **numbers); 

int main() 
{ 
    int *numbers = NULL; 

    a(&numbers); 

    for(size_t i = 0; i < 2 * SIZE; i++) 
    printf("In main after a: %i\n", numbers[i]); 

    b(numbers); 

    for(size_t i = 0; i < 2 * SIZE; i++) 
    printf("In main after b: %i\n", numbers[i]); 

    return 0; 
} 

int a(int **numbers) 
{ 
    *numbers = malloc(SIZE * sizeof(numbers)); 
    if(!numbers) 
    { 
    free(numbers); 
    return -1; 
    } 


    for(size_t i = 0; i < SIZE; i++) 
    (*numbers)[i] = i; 

    return 0; 
} 

int b(int *numbers) 
{ 
    c(&numbers); 

    for(size_t i = 0; i < 2 * SIZE; i++) 
    printf("In b after c: %i\n", numbers[i]); 

    return 0; 
} 

int c(int **numbers) 
{ 
    int *n_new = realloc(*numbers, 2 * SIZE * sizeof(numbers)); 
    if(!n_new) 
    { 
    free(n_new); 
    return -1; 
    } 

    for(size_t i = 0; i < 2 * SIZE; i++) 
    n_new[i] = i * 2; 

    *numbers = n_new; 

    return 0; 
} 

출력 :

In main after a: 0 
In main after a: 1 
In main after a: 2 
In main after a: 0 
In main after a: 0 
In main after a: 0 
In b after c: 0 
In b after c: 2 
In b after c: 4 
In b after c: 6 
In b after c: 8 
In b after c: 10 
In main after b: 0 
In main after b: 0 
In main after b: 2 
In main after b: 0 
In main after b: 0 
In main after b: 0 
+0

어 ... "a"와 "b"의 매개 변수를 비교하고 어떻게 다른지 확인하십시오. 이 차이점 때문에'a'는'main'에서 포인터 값을 바꿀 수 있지만'b'는 바꿀 수 없습니다. – hyde

+0

* 메인의 포인터 "numbers"도 재 할당 된 메모리를 가리켜 야합니까? * 아니요. "값으로 호출"이 무엇인지 알고 있습니까? –

+0

아니면 실제로 질문입니까, int ** numbers와 int ** numbers의 차이점은 무엇입니까? – hyde

답변

1

당신은뿐만 아니라 b()에 포인터 포인터를 전달해야합니다. 그 자체로 b(pointer)을 호출하면 main()의 포인터를 수정할 수 없습니다. 대신 a(&pointer)으로 전화하는 것과 같은 방식으로하십시오.

또한 null 인 경우 (malloc이 실패한 경우) free()을 호출하는 것을 귀찮게하지 마십시오. 아무것도하지 않습니다.

+0

빠른 응답을 보내 주셔서 감사합니다! 이것은 나중에 함수에서 다시 할당하려는 경우 함수 당 하나의 포인터를 추가해야한다는 의미입니까? 예를 들어, 함수 d()에서 함수 a()에서 선언 된 포인터 * p를 다시 할당하려고합니다. 그렇다면 (& p) -> b (& p) -> c (& p)를 전달한 다음 d에 다시 할당하겠습니까? 그렇다면 4-times pointer (**** p)를 d로 선언했을 것입니다. – sic

+0

@sic : 아니요, 항상 '& p'로 전달할 수 있습니다. 시도 해봐. –

+0

빠른 응답을 주셔서 다시 한번 감사드립니다. – sic