12 2. dynamic allocation

  • 239 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
239
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Dynamic Memory Allocation
  • 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);
  • 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 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; }