현재 동적 메모리 관리가 어떻게 작동하고 있는지, 특히 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
어 ... "a"와 "b"의 매개 변수를 비교하고 어떻게 다른지 확인하십시오. 이 차이점 때문에'a'는'main'에서 포인터 값을 바꿀 수 있지만'b'는 바꿀 수 없습니다. – hyde
* 메인의 포인터 "numbers"도 재 할당 된 메모리를 가리켜 야합니까? * 아니요. "값으로 호출"이 무엇인지 알고 있습니까? –
아니면 실제로 질문입니까, int ** numbers와 int ** numbers의 차이점은 무엇입니까? – hyde