동적할당
- 프로그래머가 할당 해 주는 힙 영역
- 힙 메모리상에서 할당받은 메모리 시작주소를 반환해줌.
- 무조건 포인터가 있어야함
데이터영역
- 프로그램 시작될 때부터 끝날 때 까지 main() 구동과 종료 life-cycle
스택영역
- {} block이 시작될 때부터 끝날 때까지 따라서 {}내부에선 유효한 scope, 외부에선 만료된 scope
힙 영역
- 프로그램이 실행되는 도중에 프로그래머가 지정한 포인트에서 동적으로 그 크기를 할당되고, 프로그래머가 지정한 포인트를 반환
정적 할당 vs 동적 할당
- 정적 할당 : 필요한 사이즈가 미리 정해져 있을 때
int arr[5]; // 크기가 정해져 있는 것
- 동적 할당 : 크기가 미리 정해져 있지 않는 경우,얼마나 필요한지 정확히 size 모를 때, (최대한 메모리는 필요한 만큼만 쓰고 다 썼으면 돌려줘야 함(옛날에는 중요…)
int* score = malloc(num*sizeof(int)); // 몇 바이트 필요하지? -> 넘 갯수만큼 인트형 과목수 받으려고
동적할당 함수
#include <stdlib.h> // 이 헤더가 있어야 사용 가능
1. malloc()
2. calloc()
3. realloc()
4. free()
malloc()
#include <stdio.h>
#include <stdlib.h>
int main(){
int num; // 총 과목 수
int sum = 0; // 점수 총합 저장용
printf("전체 과목수를 입력하세요 : ");
scanf("%d", &num);
printf("%d\\n", num); // 전체 과목수 입력 받음
// 동적 할당 시작
// 과목 수가 몇개인지 모르니 사용자한테 ㅁㄹ어보려고 한 것, 이제 과목 수 몇개인지
int* score = malloc(num*sizeof(int)); // 몇 바이트 필요하지? -> 넘 갯수만큼 인트형 과목수 받으려고
if(score == NULL){ // 예외 처리 다.
printf("동적 할당에 실패 했습니다.\\n");
exit(-1);
}
// 하고 싶은게 뭐지? 점수 총합 받고 평균 알아내기
// 점수 초기화 받고 , 다 더해서 sum에 저장한 다음에 과목수 만큼 나눠준 값을 프린트 하면 끝
for (int i = 0; i < num; i++){
printf("%d번째 과목 수", (i + 1));
scanf("%d", &score[i]);
sum += score[i];
}
printf("전체 점수 총합 : %d\\n", sum);
printf("전체 과목 수 : %d\\n", num);
printf("전체 평균 : %.2lf\\n", (double)sum/num);
free(score);
return 0;
}
free()
// 동적할당 해제 마지막에 꼭 해줘야 함
printf("전체 점수 총합 : %d\\n", sum);
printf("전체 과목 수 : %d\\n", num);
printf("전체 평균 : %.2lf\\n", (double)sum/num);
free(score);
반응형