리스트에 1, 2, 3을 할당하는 코드 작성
include <stdio.h>
int main(void)
{
int list[3];
list[0] = 1;
list[1] = 2;
list[2] = 3;
for (int i = 0; i<3; i++)
{
printf("%i\n", list[i]);
}
}
- 일정한 크기의 배열이 주어졌을 때, 현재 배열이 저장되어 있는 메모리 위치의 옆에 일정 크기의 메모리를 더 덧붙이면 되겠지만, 실제로는 다른 데이터가 저장되어 있을 확률이 높음
- 그래서 안전하게 새로운 공간에 큰 크기의 메모리를 다시 할당하고 기존 배열의 값들을 하나씩 옮겨줘야 함(배열의 단점)
- malloc을 이용하면 정해진 숫자를 타이핑할 필요가 없어서 일정량의 메모리를 동적으로 할당할 수 있게 됨
크기가 3인 list를 할당하고 값을 저장한 뒤에 새로운 tmp 리스트를 할당하고 list에 있던 값을 tmp로 이동하고 tmp에 네 번째 값을 추가한 뒤 list 출력
#include <stdio.h>
#include <stdlib.h>
int main(void)
{ //int 자료형 3개로 이루어진 list라는 포인터를 선언하고 메모리 할당
int *list = malloc(3 * sizeof(int));
// 포인터가 잘 선언되었는지 확인
// list가 NULL이 되면 프로그램 종료!(return이 1이면 프로그램 종료)
if (list == NULL)
{
return 1;
}
// list 배열의 각 인덱스에 값 저장
list[0] = 1;
list[1] = 2;
list[2] = 3;
//int 자료형 4개 크기의 tmp라는 포인터를 선언하고 메모리 할당
int *tmp = malloc(4 * sizeof(int));
if (tmp == NULL)
{
return 1;
}
// list의 값을 tmp로 복사)
for (int i = 0; i < 3; i++)
{
tmp[i] = list[i];
}
// tmp배열의 네 번째 값도 저장
tmp[3] = 4;
// list의 메모리를 초기화
free(list);
// list와 tmp가 같은 곳을 가리키도록 지정
list = tmp;
// 새로운 배열 list의 값 확인
for (int i = 0; i < 4; i++)
{
printf("%i\n", list[i]);
}
free(list);
}
- 위와 동일한 작업을 malloc이 아닌 realloc을 사용을 사용해서 조금 더 간단하게 표현할 수 있음
- realloc은 기존 배열에서 새로운 배열로 데이터를 복사해주는 데 이미 할당받은 기존 메모리 덩어리를 새롭게 가져오고 기존에 있던 것의 크기에 상관없이 새롭게 설정된 크기로 바꾸는 작업을 함
realloc을 사용해서 같은 결과를 내는 코드
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *list = malloc(3 * sizeof(int));
if (list == NULL)
{
return 1;
}
list[0] = 1;
list[1] = 2;
list[2] = 3;
// tmp 포인터에 메모리를 할당하고 list의 값 복사
int *tmp = realloc(list, 4 * sizeof(int));
if (tmp == NULL)
{
return 1;
}
// list가 tmp와 같은 곳을 가리키도록 지정
list = tmp;
// 새로운 tmp의 네 번째 값 저장
tmp[3] = 4;
// list의 값 확인
for (int i = 0; i < 4; i++)
{
printf("%i\n", list[i]);
}
// list의 메모리 초기화
free(list);
}
이 작업은 O(n), 즉 배열의 크기 n만큼의 실행 시간이 소요될 것(배열 전체를 새 공간에 복사하기 때문)
https://www.boostcourse.org/cs112/joinLectures/41307
'cs > CS50' 카테고리의 다른 글
6: 자료구조-4(연결 리스트: 코딩과 시연) (0) | 2021.12.11 |
---|---|
6: 자료구조-3(연결 리스트: 도입) (0) | 2021.12.11 |
6: 자료구조-1(malloc과 포인터 복습) (0) | 2021.12.11 |
5: 메모리-6(파일 쓰기와 읽기) (0) | 2021.12.06 |
5: 메모리-5(메모리 교환, 스택,힙) (0) | 2021.12.04 |