일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- putty
- simple-wireless
- Wireless Network
- trace file format
- Programming
- 무선통신
- awk
- throughput
- adhoc
- malloc
- C
- ns2
- hop
- Rally
- networking
- gnuplot
- Elasticsearch
- C++
- TCL
- 네트워크 시뮬레이터
- 동적 메모리 할당
- calloc
- NS-2
- 동호대교
- aero glass
- 애드혹
- Today
- Total
Pururoong
동적 메모리 할당(Dynamic Memory Allocation) 본문
■ C언어에서 변수를 저장하는 방법은 2가지가 있다.
■ 전역, 지역변수, 배열, 구조체는 정적 메모리 할당(Static Memory AlLocation)
이다.
■ 동적 메모리 할당은 프로그램이 얼마만큼의 메모리를 사용할 지 명확하지 않은 경우에 쓰는 방법이다. 이 방법은 여러가지 위험요소를 가져오기 때문에 꼭 필요한 경우에 사용하는 것이 좋다.
■ 이하 사용함수와 포인터를 이용한 동적 메모리 할당 예제.
-> 동적 할당 함수사용에 필요한 헤더파일 : stdlib.h
사용함수 : calloc(), free(), malloc(), realloc()
-> 메모리 초기화 함수사용에 필요한 헤더파일 : string.h
사용함수 : memset()
calloc()
#include <stdlib.h>
void *calloc(size_t num, size_t size);
// size 크기의 변수를 num개만큼 저장하는 공간을 할당한다.
// 할당에 실패하면 NULL을 반환한다.
free()
#include <stdlib.h>
void free(void *ptr);
//ptr이 가리키는 기억장소를 해제한다. 해제된 기억장소는 다른 할당을 위해 다시 사용할 수 있다.
//입력 파라미터로 NULL, 쓰례기 주소가 전달되는경우 프로그램이 죽어버리므로, 메모리 해제시
에는 반드시 유효한 포인터가 파라미터로 전달되도록 신경써야 한다.
예제>
#include <stdio.h> #include <stdlib.h> int main() { int size,n,i; int* arr; printf("할당할 배열의 크기 : "); scanf("%d", &size); arr = (int*)calloc(size, sizeof(int)); // size*sizeof(int) 만큼의 공간을 확보한다. for(i=0; i<size; i++) // 출력 printf("[%d] : %d\n",i,arr[i]); n=(sizeof(arr)*size)/sizeof(int*); // 배열의 크기 printf("\n%d\n",n); free(arr); // 할당받은 기억 장소 해제 return 0; }
malloc() realloc()
#include <stdlib.h>
void* malloc(size_t size)
// 할당시 size크기의 기억장소의 첫번째 바이트에 대한 주소 반환.
// 실패시 NULL을 반환.
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
// ptr이 가리키는 (할당된) 기억장소의 크기를 size만큼 크기로 변경.
// 크기가 변경되면 메모리 블록이 이동될 수 있으므로 원래의 메모리 블록에 대한
포인터를 반환한다.
예제 1>
#include <stdio.h> #include <stdlib.h> int main() { int* a; a=(int*)malloc(sizeof(int)); //동적 할당 if(!a) // a==NULL 할당성공여부 검사 { printf("Memory AlLocation Fail \n"); exit(1); // 비정상 종료임을 알려준다. } // 동적으로 할당된 메모리에 정수 대입 printf("a : %d\n",*a); free(a); //할당받은 공간 해제 }
예제 2> memset
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p;
p = malloc(13); // 13Byte의 공간할당
if(p==NULL) { // 할당 성공여부 검사
printf("할당에러! \n");
exit(1);
}
strcpy(p, "Hang on to a");
p = realloc(p, 28); // 28Byte로 확장
if(p==NULL) {
printf("할당에러\n");
exit(1);
}
strcat(p,"runaway train"); //
puts(p);
free(p);
return 0;
}
#include <string.h>
void *memset(void *ptr_start, int value, size_t count);
// 포인터 변수 ptr_start가 가리키는 메모리 영역을 시작으로 모두 count크키만큼을 값 value로
설정한다.
예제> 기타> ■ exit()에 관해서.... -- We define these the same for all machines. #define EXIT_FAILURE 1 -- Failing exit status. -- -- Successful exit status. -- // 비정상 종료시 1값을, 정상종료시 0값을 쓰도록 명시하고 있다.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char *ptr;
ptr = (char *)malloc( 10);
ptr[9] = NULL;
memset( ptr, 'A', 9);
// ptr의 시작주소에서 NULL까지 문자 A로 초기화 한다.
printf( "%s\n", ptr);
free(ptr);
return 0;
}
////////////////////////////////////////////////////////////////////
<stdlib.h>
Changes from this to the outside world should be done in `_exit'. --
#define EXIT_SUCCESS 0