Dynamic Memory Allocation
2
Dynamic Memory Allocation
§ 동적 메모리 할당의 필요성
– 배열의 크기를 그 때 그 때 바꾸고 싶으면?
§ 동적 메모리 할당
– program의 수행 중 new storage를 할당하는 proc...
3
Dynamic Memory Allocation
§ calloc()
– 각 원소가 object_size 바이트이고, 이 원소가 n개인 배열을
우해 메모리의 연속된 기억 공간을 할당한다.
– 각 원소는 0으로 초기화 된...
4
Dynamic Memory Allocation
§ malloc()
– object_size의 바이트의 메모리 블록을 할당한다
– 초기화 시키지는 않는다.
– 호출이 성공하면 할당된 공간의 주소를 리턴한다.
– 호출이...
5
Dynamic Memory Allocation
§ 예제
#include <stdlib.h>
int main(void) {
char *p = (char*)malloc(26) ;
int k ;
for( k = 0 ; k...
6
Dynamic Memory Allocation
§ 예제
#include <stdlib.h>
int main(void) {
int *p = (int*)malloc(26*4) ;
int k ;
for( k = 0 ; k...
7
Dynamic Memory Allocation
§ free()
– malloc이나 calloc으로 할당된 메모리가 더 이상 필요 없으면
free를 사용하여 해지시킨다.
[Ex]
p = malloc(26);
…
fre...
8
Dynamic Memory Allocation
§ Dangling Pointer
– free한 포인터를 사용하면?
[Ex]
char *p = malloc(40) ;
free(p);
p[0] = ‘A’ ;
printf...
9
Dynamic Memory Allocation
§ garbage
– 프로그램 내에서 calloc(), malloc()로 할당한 메모리 block 중
더 이상 필요 없는 것을 free하지 않고 그냥 놓아두면, 메모리
...
10
Dynamic Memory Allocation
§ garbage
int main()
{
int* p ;
p = malloc(100) ;
p = malloc(100) ;
…
}
1000
100 bytes
1000
p...
11
Dynamic Memory Allocation
§ 임의 개수의 숫자를 입력 받아 역순으로 출력하기
int main() {
int k, p[20], num ; //array사용
while( 1 ) {
printf( ...
12
Dynamic Memory Allocation
§ 임의 개수의 숫자를 입력 받아 역순으로 출력하기
int main() {
int k, *p, num ; //dynamic memory allocation사용
whil...
Upcoming SlideShare
Loading in …5
×

12 2. dynamic allocation

1,007 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,007
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

12 2. dynamic allocation

  1. 1. Dynamic Memory Allocation
  2. 2. 2 Dynamic Memory Allocation § 동적 메모리 할당의 필요성 – 배열의 크기를 그 때 그 때 바꾸고 싶으면? § 동적 메모리 할당 – program의 수행 중 new storage를 할당하는 process – stdlib.h에 함수 calloc()와 malloc()가 정의. – calloc()은 인접한 할당 (contiguous allocation)을 의미 – malloc()은 메모리 할당 (memory allocation)을 의미. malloc()과 calloc()을 사용한다.
  3. 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. 4 Dynamic Memory Allocation § malloc() – object_size의 바이트의 메모리 블록을 할당한다 – 초기화 시키지는 않는다. – 호출이 성공하면 할당된 공간의 주소를 리턴한다. – 호출이 성공하지 못하면 NULL을 리턴한다. – Return type은 void* malloc ( object_size ); size of each object
  5. 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. 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. 7 Dynamic Memory Allocation § free() – malloc이나 calloc으로 할당된 메모리가 더 이상 필요 없으면 free를 사용하여 해지시킨다. [Ex] p = malloc(26); … free(p); free를 호출하는 것은 p가 point하고 있는 memory block를 해제하는 것이다. void free(void *ptr);
  8. 8. 8 Dynamic Memory Allocation § Dangling Pointer – free한 포인터를 사용하면? [Ex] char *p = malloc(40) ; free(p); p[0] = ‘A’ ; printf( “%cn”, p[0] ) ; 1000 40 bytes 1000 p 1000p free(p) ???
  9. 9. 9 Dynamic Memory Allocation § garbage – 프로그램 내에서 calloc(), malloc()로 할당한 메모리 block 중 더 이상 필요 없는 것을 free하지 않고 그냥 놓아두면, 메모리 가 점점 모자라게 되어 결국 프로그램이 정상적으로 수행되 지 않는다. – 이렇게 쓸 수 없게 된 memory block를 garbage라 한다. while( 1 ) { p = malloc( 100 ) ; }
  10. 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. 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. 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; }

×