21 - Dynamic Allocation
<학습하기>
동적할당 (Dynamic Allocation)
보통 여러개의 데이터를 관리하기 위해서는 배열을 사용.
그러나 배열은 항상 그 크기를 미리 알고 있어야 만들 수 있었으며
상황에 따라 다른 크기의 배열을 만들 수는 없었다.
상황에 따라 다른 크기의 배열이 필요한 경우 사용하는 것이 동적할당이다.
프로그램의 메모리는 '스택'(stack) 부분과 '힙'(heap) 부분으로 나뉘어 진다.
일반적으로 만들어지는 변수는 스택부분에 만들어지며
스택에 만들어지는 변수는 자동으로 생성되고 소멸되지만 용량의 한계가 존재한다.
반면, 힙 부분의 메모리는 필요할 때 일정량을 할당받아 사용하며,
사용이 끝나면 반환해야 한다.
그러나 스택보다 힙이 용량이 더 크며 자동으로 사라지지 않으므로 활용성이 높다.
동적할당 방법
동적할당하는 함수 : malloc()
형식 : malloc(할당받을 크기)
반환형식 : void *
메모리에서 [할당받을 크기]만큼의 메모리를 할당해서 그 포인터를 반환.
이 포인터를 배열처럼 사용 가능하다.
int *array = (int*)malloc(sizeof(int) * 10);
//정수형 10개를 보관할 메모리 할당.
이렇게 하면 이 array를 정수형 10개짜리 배열로 사용가능하다.
반환형식이 void이기 때문에 캐스팅을 해야한다.
메모리 반납 함수 : free(할당받은 메모리)
free(array);
//할당 받았던 메모리를 반납.
정적배열(일반적 배열)과 동적배열의 차이
정적배열(일반적 배열) 동적배열
int array[10]; int * array = (int*)malloc(sizeof(int) * 10);
함수에 종속되어 있으므로 함수에 종속되지 않았으므로
함수가 끝나면 파괴된다. 함수가 끝나도 남아있다.
메모리 관리할 필요없다. 할당받은 메모리는 반드시 free()로 반납해야한다.
동적할당에 관련된 함수들은 malloc.h에 정의되어 있다.
------------------------------------------------------------------------------------
sizeof : 대상의 크기 (메모리에서 차지하는 바이트 수)를 반환하는 연산자.
형식
sizeof(자료형)
sizeof(변수형)
sizeof(변수이름)
ex)
sizeof(int) => int형이 차지하는 메모리 크기. (4반환)
<실습하기>
#include <stdio.h>
#include <malloc.h> //동적할당 하기위해!
#include <string.h> //strcpy 쓰기위해!
//BlueDragon.exam파일에서 학생들의 정보를 읽어
//반평균을 계산하도록 하라.
//학생들의 정보를 저장할 구조체
struct Student
{
char name [20];
int clang;
int java;
int python;
};
struct Student *ReadStudentInfo(int *studNumber);
main()
{
int index; //for 학생들 데이터 출력.
int studNumber;//학생들의 숫자를 받아올 변수
//학생들의 정보를 읽어올 함수
struct Student *studInfo = ReadStudentInfo(&studNumber);
//??? 왠지는 모르겠는데 학생수도 받아오래..
//학생들 데이터 출력
for(index = 0; index < studNumber; ++index)
{
printf(" %s %d %d %d\n", studInfo[index].name, studInfo[index].clang, studInfo[index].java,studInfo[index].python);
}
{
int clangTotal = 0;
int javaTotal = 0;
int pythonTotal = 0;
for(index = 0; index < studNumber; ++index)
{
clangTotal += studInfo[index].clang;
javaTotal += studInfo[index].java;
pythonTotal += studInfo[index].python;
}
printf("c언어 평균 : %f\n", (double)clangTotal / studNumber);
printf("자바 평균 : %f\n", (double)javaTotal / studNumber);
printf("파이썬 평균 : %f\n", (double)pythonTotal / studNumber);
}
free(studInfo); //studInfo는 ReadStudentInfo()에서 동적할당받은 메모리 이므로
// 끝나기 전에 반납해야한다.
}
struct Student *ReadStudentInfo(int *studNumber)
{ //학생들의 정보를 읽어 온다.
//Student 구조체의 배열에 저장.
struct Student *arr;
int count; //학생수를 저장할 변수
int index;
//파일 열기
FILE *fp = fopen("BlueDragon.exam", "r");
if (fp == NULL)
{
puts("파일 열기 실패.");
return;
}
//학생수 읽기
fscanf(fp,"학생수 : %d\n" , &count);
//줄바꿈 문자 주의하자.
*studNumber = count;
//??
//count명 분의 학생을 저장할 배열 만들기. (동적 할당)
arr= (struct Student*)malloc(sizeof(struct Student) * count);
//count명 분의 Student크기.
for(index = 0; index < count; ++index)
{
//각 학생의 정보 읽기.
char name[20];
int clang;
int java;
int python;
fscanf(fp, "이름 : %s c언어 : %d 자바 : %d 파이썬 : %d\n", name, &clang, &java, &python);
strcpy(arr[index].name,name);
arr[index].clang = clang;
arr[index].java = java;
arr[index].python = python;
//??????????
}
return arr;
}
동적할당 (Dynamic Allocation)
보통 여러개의 데이터를 관리하기 위해서는 배열을 사용.
그러나 배열은 항상 그 크기를 미리 알고 있어야 만들 수 있었으며
상황에 따라 다른 크기의 배열을 만들 수는 없었다.
상황에 따라 다른 크기의 배열이 필요한 경우 사용하는 것이 동적할당이다.
프로그램의 메모리는 '스택'(stack) 부분과 '힙'(heap) 부분으로 나뉘어 진다.
일반적으로 만들어지는 변수는 스택부분에 만들어지며
스택에 만들어지는 변수는 자동으로 생성되고 소멸되지만 용량의 한계가 존재한다.
반면, 힙 부분의 메모리는 필요할 때 일정량을 할당받아 사용하며,
사용이 끝나면 반환해야 한다.
그러나 스택보다 힙이 용량이 더 크며 자동으로 사라지지 않으므로 활용성이 높다.
동적할당 방법
동적할당하는 함수 : malloc()
형식 : malloc(할당받을 크기)
반환형식 : void *
메모리에서 [할당받을 크기]만큼의 메모리를 할당해서 그 포인터를 반환.
이 포인터를 배열처럼 사용 가능하다.
int *array = (int*)malloc(sizeof(int) * 10);
//정수형 10개를 보관할 메모리 할당.
이렇게 하면 이 array를 정수형 10개짜리 배열로 사용가능하다.
반환형식이 void이기 때문에 캐스팅을 해야한다.
메모리 반납 함수 : free(할당받은 메모리)
free(array);
//할당 받았던 메모리를 반납.
정적배열(일반적 배열)과 동적배열의 차이
정적배열(일반적 배열) 동적배열
int array[10]; int * array = (int*)malloc(sizeof(int) * 10);
함수에 종속되어 있으므로 함수에 종속되지 않았으므로
함수가 끝나면 파괴된다. 함수가 끝나도 남아있다.
메모리 관리할 필요없다. 할당받은 메모리는 반드시 free()로 반납해야한다.
동적할당에 관련된 함수들은 malloc.h에 정의되어 있다.
------------------------------------------------------------------------------------
sizeof : 대상의 크기 (메모리에서 차지하는 바이트 수)를 반환하는 연산자.
형식
sizeof(자료형)
sizeof(변수형)
sizeof(변수이름)
ex)
sizeof(int) => int형이 차지하는 메모리 크기. (4반환)
<실습하기>
#include <stdio.h>
#include <malloc.h> //동적할당 하기위해!
#include <string.h> //strcpy 쓰기위해!
//BlueDragon.exam파일에서 학생들의 정보를 읽어
//반평균을 계산하도록 하라.
//학생들의 정보를 저장할 구조체
struct Student
{
char name [20];
int clang;
int java;
int python;
};
struct Student *ReadStudentInfo(int *studNumber);
main()
{
int index; //for 학생들 데이터 출력.
int studNumber;//학생들의 숫자를 받아올 변수
//학생들의 정보를 읽어올 함수
struct Student *studInfo = ReadStudentInfo(&studNumber);
//??? 왠지는 모르겠는데 학생수도 받아오래..
//학생들 데이터 출력
for(index = 0; index < studNumber; ++index)
{
printf(" %s %d %d %d\n", studInfo[index].name, studInfo[index].clang, studInfo[index].java,studInfo[index].python);
}
{
int clangTotal = 0;
int javaTotal = 0;
int pythonTotal = 0;
for(index = 0; index < studNumber; ++index)
{
clangTotal += studInfo[index].clang;
javaTotal += studInfo[index].java;
pythonTotal += studInfo[index].python;
}
printf("c언어 평균 : %f\n", (double)clangTotal / studNumber);
printf("자바 평균 : %f\n", (double)javaTotal / studNumber);
printf("파이썬 평균 : %f\n", (double)pythonTotal / studNumber);
}
free(studInfo); //studInfo는 ReadStudentInfo()에서 동적할당받은 메모리 이므로
// 끝나기 전에 반납해야한다.
}
struct Student *ReadStudentInfo(int *studNumber)
{ //학생들의 정보를 읽어 온다.
//Student 구조체의 배열에 저장.
struct Student *arr;
int count; //학생수를 저장할 변수
int index;
//파일 열기
FILE *fp = fopen("BlueDragon.exam", "r");
if (fp == NULL)
{
puts("파일 열기 실패.");
return;
}
//학생수 읽기
fscanf(fp,"학생수 : %d\n" , &count);
//줄바꿈 문자 주의하자.
*studNumber = count;
//??
//count명 분의 학생을 저장할 배열 만들기. (동적 할당)
arr= (struct Student*)malloc(sizeof(struct Student) * count);
//count명 분의 Student크기.
for(index = 0; index < count; ++index)
{
//각 학생의 정보 읽기.
char name[20];
int clang;
int java;
int python;
fscanf(fp, "이름 : %s c언어 : %d 자바 : %d 파이썬 : %d\n", name, &clang, &java, &python);
strcpy(arr[index].name,name);
arr[index].clang = clang;
arr[index].java = java;
arr[index].python = python;
//??????????
}
return arr;
}
댓글
댓글 쓰기