동적할당된 구조체 포인터를 가져와서 다른 함수에서 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 함수 사용해서 문제가 있나하고 그쪽만 찾아봤지 연산자 우선순위 문제일줄은 몰랐다. 연산자 우선순위를 그렇게 중요하다고 생각을 못했는데 이렇게 한번 데여보니까 정말 중요한 개념이라는 것을 알았다.