June is Combung
동적할당과 정적할당 본문
#include <stdio.h>
#include <stdlib.h> // malloc(), free()
#include <string.h> // strcpy_s()
/*
< 동적할당 vs 정적할당 >
1. 정적할당
-> 컴파일 시 결정되는 할당
-> 개발자가 미리 계획한 할당
ex) 변수/배열 선언
-> 한 번 태어나면 그 자료형이나 개수가 변경되지 않는다.
-> 수명이 정해져있다.
지역 : 선언된 {}가 종료되면
전역 : 프로그램이 종료되면
....
-> 단점
1. 고정된 할당이기 때문에
배열의 경우 그 크기가 변경될 수 없다.
2. 수명이 결정되어있기 때문에
더이상 필요하지 않은 변수/배열임에도 자동으로 해제될 때까지 할당을 유지
==> 비효율적인 메모리 사용
2. 동적할당
-> 런타임(실행) 중 결정되는 할당
-> malloc() 통해 할당하고, free() 해제한다.
-> heap 영역에 할당된다.
=> 주소를 통해서만 접근할 수 있다. (이름을 지어줄 수 없다.)
-> 프로그램이 종료되면 해제되지만,
원하는 시점에 free() 로 해제가 가능하다.
(왠만하면 free()는 꼭 쓰자!)
*/
void ex01(){
// 학생 수를 입력 받고,
// 그 수만큼 국어점수를 저장할 배열을 선언
int num;
printf("학생 수 : ");
scanf_s("%d", &num);
int* kr = (int*)malloc(sizeof(int) * num); // int kr[num];
int i;
for(i = 0; i < num; ++i){
printf("%d번 학생의 국어점수 : ", i);
scanf_s("%d", &kr[i]);
}
for(i = 0; i < num; ++i){
printf("kr[%d] : %d \n", i, kr[i]);
}
free(kr);
}
typedef struct Person {
char name[20];
int age;
} PER;
void ex02(){
// malloc()
// 포인터변수 = (자료형*)malloc(바이트수)
// : 바이트 수 만큼 할당한 후, 할당된 곳의 시작주소를 return
// free(주소)
// double 형 메모리 동적할당하겠다
double* pa = (double*)malloc(sizeof(double));
// dounble형 3칸짜리 배열을 동적할당하겠다
double* pb = (double*)malloc(sizeof(double) * 3);
// PER 구조체 1개를 동적할당하겠다.
PER* pc = (PER*)malloc(sizeof(PER));
*pa = 4.15;
pb[0] = 10.0;
pb[1] = 20.0;
pb[2] = 30.0;
strcpy_s(pc->name, sizeof(pc->name),"이푸린"); // pc->name = "이푸린"
pc->age = 10;
printf("%lf \n", *pa);
printf("%lf %lf %lf \n", pb[0], pb[1], pb[2]);
printf("%s, %d세 \n", pc->name, pc->age);
free(pa);
free(pb);
free(pc);
}
int main(){
ex02();
return 0;
}
Comments