2. 2
Dynamic Memory Allocation
§ 동적 메모리 할당의 필요성
– 배열의 크기를 그 때 그 때 바꾸고 싶으면?
§ 동적 메모리 할당
– program의 수행 중 new storage를 할당하는 process
– stdlib.h에 함수 calloc()와 malloc()가 정의.
– calloc()은 인접한 할당 (contiguous allocation)을 의미
– malloc()은 메모리 할당 (memory allocation)을 의미.
malloc()과 calloc()을 사용한다.
3. 3
Dynamic Memory Allocation
§ calloc()
– 각 원소가 object_size 바이트이고, 이 원소가 n개인 배열을
우해 메모리의 연속된 기억 공간을 할당한다.
– 각 원소는 0으로 초기화 된다.
– 호출이 성공하면 할당된 기억공간의 주소를 리턴한다.
– 호출이 성공하지 못하면 NULL을 리턴한다.
– Return type은 void*
calloc ( n, object_size );
size of each objectnumber of objects
4. 4
Dynamic Memory Allocation
§ malloc()
– object_size의 바이트의 메모리 블록을 할당한다
– 초기화 시키지는 않는다.
– 호출이 성공하면 할당된 공간의 주소를 리턴한다.
– 호출이 성공하지 못하면 NULL을 리턴한다.
– Return type은 void*
malloc ( object_size );
size of each object
5. 5
Dynamic Memory Allocation
§ 예제
#include <stdlib.h>
int main(void) {
char *p = (char*)malloc(26) ;
int k ;
for( k = 0 ; k < 26 ; k++ )
p[k] = ‘A’ + k ;
return 0;
}
#include <stdlib.h>
int main(void) {
char *p = (char*)calloc(26, 1) ;
int k ;
for( k = 0 ; k < 26 ; k++ )
p[k] = ‘A’ + k ;
return 0;
}
6. 6
Dynamic Memory Allocation
§ 예제
#include <stdlib.h>
int main(void) {
int *p = (int*)malloc(26*4) ;
int k ;
for( k = 0 ; k < 26 ; k++ )
p[k] = k ;
return 0;
}
#include <stdlib.h>
int main(void) {
int *p = (int*)calloc(26, 4) ;
int k ;
for( k = 0 ; k < 26 ; k++ )
p[k] = k ;
return 0;
}
7. 7
Dynamic Memory Allocation
§ free()
– malloc이나 calloc으로 할당된 메모리가 더 이상 필요 없으면
free를 사용하여 해지시킨다.
[Ex]
p = malloc(26);
…
free(p);
free를 호출하는 것은 p가
point하고 있는 memory
block를 해제하는 것이다.
void free(void *ptr);
9. 9
Dynamic Memory Allocation
§ garbage
– 프로그램 내에서 calloc(), malloc()로 할당한 메모리 block 중
더 이상 필요 없는 것을 free하지 않고 그냥 놓아두면, 메모리
가 점점 모자라게 되어 결국 프로그램이 정상적으로 수행되
지 않는다.
– 이렇게 쓸 수 없게 된 memory block를 garbage라 한다.
while( 1 ) {
p = malloc( 100 ) ;
}
10. 10
Dynamic Memory Allocation
§ garbage
int main()
{
int* p ;
p = malloc(100) ;
p = malloc(100) ;
…
}
1000
100 bytes
1000
p
2000
100 bytes
2000
p
100 bytes
1000
p =malloc(100)
11. 11
Dynamic Memory Allocation
§ 임의 개수의 숫자를 입력 받아 역순으로 출력하기
int main() {
int k, p[20], num ; //array사용
while( 1 ) {
printf( “How many numbers?” ) ;
scanf( “%d”, &num ) ;
if( num < 0 ) break ;
for( k = 0 ; k < num ; k++ ) scanf( “%d”, &p[k] ) ;
for( k = num-1 ; k >= 0 ; k-- ) printf( “%d ”, p[k] ) ;
}
return 0;
}
12. 12
Dynamic Memory Allocation
§ 임의 개수의 숫자를 입력 받아 역순으로 출력하기
int main() {
int k, *p, num ; //dynamic memory allocation사용
while( 1 ) {
printf( “How many numbers?” ) ;
scanf( “%d”, &num ) ;
if( num < 0 ) break ;
p = calloc( num, sizeof(int) ) ;
for( k = 0 ; k < num ; k++ ) scanf( “%d”, &p[k] ) ;
for( k = num-1 ; k >= 0 ; k-- ) printf( “%d ”, p[k] ) ;
free( p ) ;
}
return 0;
}