동적 메모리 할당: 일반적으로 변수는 프로그램을 실행하는 순간
사용할 메모리의 크기를 고려하여 메모리를 할당
-> 이렇게 프로그램이 실행되기 전 할당 되는 메모리를 정적 메모리 라고 한다
따라서, 프로그램 실행 도중 메모리를 할당 받는 것을 동적 메모리 할당이라고 한다
<동적메모리 할당이 필요한 이유?>
3명의 사용자의 점수 입력 받아 저장
int score[3];
scanf("%d", &score[0]);
scanf("%d", &score[1]);
scanf("%d", &score[2]);
=>정적 메모리
:프로그램이 실행되기전 이미 결정 된 크기를 갖는다
몇 명 입력하시겠습니까? (입력 숫자)
입력한 숫자만큼 배열의 크기를 생성
->프로그램이 실행되고 있는 순간에 배열의 크기를 지정 (내가 코드를 계속 수정할 필요가 없다!)
동적 메모리를 사용해서 프로그램이 실행 도중에 배열의 크기 지정
<동적메모리 할당 방법>
1) #include <stdlib.h>
2) malloc() 함수 사용
malloc(할당 받을 메모리 크기);
: malloc는 ()괄호 안에 적은 숫자byte 크기 만큼 메모리를 할당하여
할당받은 메모리의 시작 주소를 반환 하는 함수
3) 저장할 포인터 생성
malloc() 함수가 할당 받은 메모리의 시작 주소를 반환하므로
시작 주소를 저장할 포인터를 생성하여 포인터에 주소 저장
#include <stdlib.h>
void main(){
int *pa;
pa=(int*)malloc(sizeof(int)*3);
free(pa);
}
*sizeof(자료형) : 해당 자료형의 바이트 크기 변환
free(포인터) : 동적 할당 받은 메모리 해제
#include <stdio.h>
#include <stdlib.h>
void main() {
int* pa;
int sum = 0, i, j;
float avg;
printf("입력할 정수의 개수: ");
scanf_s("%d", &j);
pa = (int*)malloc(sizeof(int) * j);
for (i = 0; i < j; i++) {
printf("%d번째 숫자 입력: ", i + 1);
scanf_s("%d", &pa[i]); //pa의 i번째에 저장, &pa[i]=&*(pa+i)
sum += pa[i];
}
free(pa);
avg = sum / (float)j;
printf("sum=%d\n", sum);
printf("avg=%5.3f\n", avg); //숫자는 5의 자리 까지 표시, 소수점은 3자리 까지만 표시
}
입력할 정수의 개수: 4
1번째 숫자 입력: 67
2번째 숫자 입력: 12
3번째 숫자 입력: 34
4번째 숫자 입력: 6
sum=119
avg=29.750
동적 메모리 할당-2차원 배열
1) #include <stdlib.h>
2) malloc() 함수 사용
3) 할당 받을 메모리를 저장할 이중 포인터 생성
4) 1차원 배열을 생성할 단일 포인터 생성
5) 단일포인터와 이중포인터 모두 free
#include <stdio.h>
#include <stdlib.h>
//2차원배열 동적할당
void main() {
int arr[3][5];
int x = 1;
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 5; i++) {
arr[j][i] = x++; //x의 값을 1부터 증가시키기
}
}
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 5; i++) {
printf("%d ", arr[j][i]);
}
printf("\n");
}
}
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
int arr[3][5];
=> 5칸짜리 배열을 3줄 만들어라!
#include <stdio.h>
#include <stdlib.h>
//2차원배열 동적할당
void main() {
int arr[3][5];
int x = 1;
int row, col;
int** dbptr; //이중 포인터를 생성하여 2차원 배열 생성하기
printf("행: ");
scanf_s("%d", &row);
printf("열: ");
scanf_s("%d", &col);
dbptr = (int**)malloc(sizeof(int*) * row);
for (int i = 0; i < row; i++) {
dbptr[i] = (int*)malloc(sizeof(int) * col);
//dbptr의 i번째 방에 크기 할당하기 (정수형 변수 col만큼 곱하기)
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
dbptr[i][j] = x++;
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("%d ", dbptr[i][j]);
}
printf("\n");
}
for (int i = 0; i < row; i++) {
free(dbptr[i]);
}
free(dbptr);
}
행: 4 (입력)
열: 5 (입력)
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
'Dev. > C++' 카테고리의 다른 글
구조체 종합문제 5 (0) | 2022.04.10 |
---|---|
구조체 종합문제 (0) | 2022.04.06 |
구조체배열 응용문제 (0) | 2022.04.05 |
구조체와 배열/구조체와 포인터 (0) | 2022.04.05 |
메모리의 동적할당/malloc (0) | 2022.04.04 |
댓글