-
C언어 기초#14 동적 메모리와 연결 리스트Programming 기초/C Language 2023. 5. 3. 19:49
* 동적 할당 메모리
프로그램이 메모리를 할당받는 방법에는 정적과 동적의 2가지 방법이 있다.
정적 메모리 할당(static memory allocation)이란 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당받는 것이다. 이 경우, 메모리의 크기는 프로그램이 시작하기 전에 결정되며 프로그램의 실행 도중에 크기가 변경될 수는 없다.int score_s[100]; //배열을 선언하면 정적으로 메모리 할당받는다.
동적 메모리 할당(dynamic memory allocation)이란 프로그램이 실행 도중에 동적으로 메모리를 할당받는 것을 말한다. 필요한 만큼의 메모리를 할당받아 사용하고, 메모리를 반납한다.
score = (int *) malloc(100*sizeof(int));
그렇다면 동적 할당이 필요한 이유를 예시를 통해 알아보자.int n; printf("배열의 크기를 입력해주세요: “); scanf("%d", &n); int array[n];
실제로 위의 코드를 실행하면 에러가 발생한다. 배열 array를 선언할 때 배열의 크기를 n으로 받는데, 배열은 컴파일될 때 그 크기가 결정되어야 하는 정적할당 방식을 취한다. 하지만 위 코드에서는 n이 컴파일 이후에 결정되는 변수이기에 배열은 그 크기가 정해지지 못한다. 이 같이 입력을 받아 그 입력 값을 활용하고자 할 때 동적할당 방식이 필요한 것이다.
정적할당은 결국 컴파일시에 메모리에 변수의 크기를 할당하는 과정이고, 동적할당은 런타임시에 주소를 할당받는다.
동적할당은 포인터 개념을 활용해야만 한다.int n; int *array; int *ptr=NULL; printf("배열의 크기를 입력해주세요: "); scanf("%d", &n); printf("%d\n",n); // malloc은 동적할당된 메모리의 첫 번째 주소를 반환해준다. // malloc의 타입은 void* 이므로, 명시적 형변환을 해준다. array = (int*) malloc(n * sizeof(int));
직관적으로 눈으로 확인하기 위해 아래와 같이 배열을 만들어보았다.#include <stdio.h> #include <stdlib.h> int main() { int n; int *array; int *ptr=NULL; printf("배열의 크기를 입력해주세요: "); scanf("%d", &n); printf("%d\n",n); // malloc은 동적할당된 메모리의 첫 번째 주소를 반환해준다. // malloc의 타입은 void* 이므로, 명시적 형변환을 해준다. array = (int*) malloc(n * sizeof(int)); ptr = array; for (int i = 0; i < n; i++ ){ *ptr = i*5; ptr++; } printf("%d\n", *array); printf("%d\n", *(array+1)); printf("%d\n", *(array+2)); printf("%d\n", *(array+3)); free(array); return 0; } --------------------------------------------------------------------------- 배열의 크기를 입력해주세요: 4 0 5 10 15
위 코드를 배열 접근 연산자, ‘[ ]’ 를 이용해서 리팩토링하자. (Feat. Chat GPT)#include <stdio.h> #include <stdlib.h> int main() { int n; printf("배열의 크기를 입력해주세요: "); scanf("%d", &n); printf("%d\n", n); // 배열 동적 할당 int *array = (int*)malloc(n * sizeof(int)); if (array == NULL) { // 메모리 할당 실패 시 처리 printf("메모리 할당 오류\n"); return 1; } // 배열 초기화 for (int i = 0; i < n; i++) { array[i] = i * 5; } // 배열 요소 출력 for (int i = 0; i < n; i++) { printf("%d\n", array[i]); } // 메모리 해제 free(array); return 0; }
작성중...'Programming 기초 > C Language' 카테고리의 다른 글
C언어 기초#13 스트림과 파일 입출력 printf scanf 심화, fopen(), fclose(), 이진 파일 읽고 쓰기, 버퍼링, fseek(), rewind(), ftell(), foef() (0) 2023.05.03 C언어 기초#12 전처리 및 비트 필드 (0) 2023.04.28 C언어 기초#11 이중포인터, 함수포인터, 배열포인터, void포인터 (0) 2023.04.18 C언어 기초#10 구조체와 포인터, 공용체(union), 열거형(enum), typedef (0) 2023.04.15 C언어 기초#9 문자열(string) (0) 2023.04.13