본문 바로가기
자료구조

(cs50)Lecture 5 - Data Structures realloc 부분 짚고 넘어가기

by korea_musk 2022. 5. 8.

cs50 5주차 강의를 듣는 중 동적 할당에서 메모리 늘리는 법에 관한 것이 이해가 안가서 찾아보았다.

 

먼저 3개의 정수 크기로 동적 할당을 한다.

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

int main (void)
{
	//동적할당을 이용하여 3개 정수 메모리 확보 (int size는 4byte)
    int *list = malloc(3 * sizeof(int));
    // 컴퓨터 메모리 부족할 시 오류 반환
    if(list == NULL)
    {
    	return 1;
    }
    
    list[0] = 1;
    list[1] = 2;
    list[2] = 3;
}

이제 list에는 1 2 3 이라는 숫자가 들어가 있다.

여기서 4라는 숫자를 추가하고 싶다면 

새롭게 정수 4개짜리 크기의 메모리를 만들고

list에 있던 1 2 3을 옮긴 후 뒤에 4를 넣어주면 된다.

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

int main (void)
{
	//동적할당을 이용하여 3개 정수 메모리 확보 (int size는 4byte)
    int *list = malloc(3 * sizeof(int));
    
    if(list == NULL)
    {
    	return 1;
    }
    list[0] = 1;
    list[1] = 2;
    list[2] = 3;
    
    int *tmp = malloc(4 * sizeof(int))
    
    if(tmp == NULL)
    {
    	free(list);
        return 1;
    }
    
    for (int i = 0; i < 3; i++)
    {
    	tmp[i] = list[i];
    }
    tmp[3] = 4;
    
    free(list);
    
    list = tmp;
    
    for (int i = 0; i < 4; i++)
    {
    	printf("%i\n", list[i]);
    }
    free(list);
    return 0;
}

새롭게 만들어낸 tmp는 정수 4개 크기 

list에 있던 숫자를 tmp에 순서대로 옮긴 후

tmp의 네번 째의 tmp[3]에 4를 넣어준다.

문제는 

tmp[3] = 4;
    
free(list);
    
list = tmp;

숫자를 대입한 후 예전 list의 동적할당을 풀어버리고 (free)

 

다시 list 에 tmp를 대입하는 코드이다.

 

이제 realloc 재할당은  void *realloc(void *memblock, size_t size)

원래 있던 메모리를 size 변경 후 다시 사용하는 것이다.

 

위 코드를 realloc를 사용하면

    int *tmp = realloc(list, 4 * sizeof(int))
    
    if(tmp == NULL)
    {
    	free(list);
        return 1;
    }
    
    for (int i = 0; i < 3; i++)
    {
    	tmp[i] = list[i];
    }
    tmp[3] = 4;
    
    //free(list); 이 부분이 사라진다
    
    list = tmp;

list를 정수 4크기로 변경한 것이다.

 

realloc이 어떻게 사용되는지를 살펴보면 이해가 간다.

 

원래 있던 정수 3개의 list에서 정수 4개의 list로 변경하려면 

 

1. list 끝 메모리가 비어있어 사용 가능할 때

메모리 위치를 변경하지 않고 메모리의 끝을 사용한다.

 

2. list 끝 메모리가 비어 있지않아 사용 불가능할 때

새로운 메모리를 만들어 값을 복사하여 사용한다.

이때 전에 사용하던 정수 3개짜리 메모리는 free처리한다.

메모리 위치가 변경된다.

 

강의에서 코드 가운데 free(list); 를 사용한 것도 realloc의 사용 방법을 보여준 것이라 생각된다.

'자료구조' 카테고리의 다른 글

(c++) 비트마스크(bitmask) 정리  (1) 2024.01.30
힙 구조, 우선순위 큐  (0) 2024.01.07
[C]스택의 이해  (0) 2022.01.09

댓글