realloc 함수간 사용(이중포인터)

·2023년 3월 14일
0

📌구현하고 싶은것

동적할당된 구조체 포인터를 가져와서 다른 함수에서 realloc을 해서 크기를 바꾼다.

처음에는 함수내에서 return으로 realloc된 구조체포인터를 넘겨줬는데 이 방법에는 함수에서 받을때마다 =로 대입해줘야 하는 번거러움이 있었다. 편하게 쓰기위해 이중포인터를 써서 구현해보기로 했다.

typedef struct Test {
	int a;
}t;
int main()
{
	t* test = (t*)malloc(sizeof(t));
	test = change_size(test);
	print(test);

}
t* change_size(t* test)
{
	int size = 10;
	test = (t*)realloc(test, sizeof(t) * size);
	for (int i = 0; i < size; i++)
	{
		scanf("%d", &test[i].a);
	}
	return test;
}

이중포인터를 쓰기 위해서 넘어오는 주소를 확인해봤다.

int main()
{
	t* test = (t*)malloc(sizeof(t));
	printf("test 의 주소 : %p\n", test);
	check_address(&test);
	//print(test);

}
void check_address(t** test)
{
	printf("**test의 주소 : %p\n", **test);
	printf("*test의 주소 : %p\n", *test);
	printf("test의 주소 : %p\n", test);
}

main의 test와 *test의 주소가 동일하다.
함수간에 t** test = &test(원형은 t* test) 이런식으로 넘겨줬으니 당연한 결과였지만
아는것과 쓰는건 다른 느낌이었다.
포인터

이 다음 구간에서 하루종일 삽질했다.

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

typedef struct Test {
	int a;
	int b;
}t;
void change_size(t** test, int * arr_size);
void print_arr(t* test, int arr_size);
int main()
{
	int arr_size = 3;
	t* test = (t*)malloc(sizeof(t) * arr_size);
	change_size(&test, &arr_size);
	print_arr(test, arr_size);
	
	free(test);
	return 0;
}
void change_size(t** test, int* arr_size)
{
	*arr_size += 3;
	*test = (t *)realloc(*test, sizeof(t) * *arr_size);

	for (int i =0; i < *arr_size; i++)
	{
		scanf("%d",  &(*test)[i].a);
	}
}
void print_arr(t* test, int arr_size)
{
	for (int i = 0; i < arr_size; i++)
	{
		printf("%d ", test[i].a);
	}
	return;
}

자꾸 입력창에서 메모리 오류가 나는것이었다.
이를 해결하기위해서 혹시 realloc할 때 메모리 주소값이 바뀌는 경우도 있다고 해서 realloc으로 다시 할당된 포인터의 주소를 함수 밖과 안을 비교 해봤는데 똑같은 경우가 많았고 달라지더라도 이전의 포인터주소도 달라져서 결과적으로는 함수 밖의 test와 함수안의 *test의 주소값은 같았다.

scanf 받아오는 과정이 틀린가해서 이것 저것 바꿔봐도 이상하게 자꾸 메모리 오류가 났다.

&(*test)[i].a

문제가 된 부분은 이부분이었다.
연산자 우선순위 때문에 *test 다음에 [i]가 붙어야하는데 []가 *보다 순위가 높아서 test[i] 다음에 * 붙어서 문제가 생기는 문제였다.

realloc 함수 사용해서 문제가 있나하고 그쪽만 찾아봤지 연산자 우선순위 문제일줄은 몰랐다. 연산자 우선순위를 그렇게 중요하다고 생각을 못했는데 이렇게 한번 데여보니까 정말 중요한 개념이라는 것을 알았다.

profile
개인공부저장용(하루의 기록)

0개의 댓글