1. malloc
- malloc함수의 리턴값은 요구한 메모리를 얻으면 메모리의 시작주소를 리턴해주고 얻지 못하는 경우에는 NULL을 리턴해 준다. NULL은 주소값이 없다는 것을 뜻한다.
char *p;
p=(char *)malloc(10 * sizeof(char));
2. malloc과 calloc의 차이
- malloc함수는 요구한 메모리를 초기화 하지 않는 반면에 calloc함수는 요구한 메모리의 값을 0으로 초기화 해준다
char *pmem;
pmem = (char *)calloc(10,sizeof(int));
3. realloc
realloc함수는 할당 받은 메모리의 크기를 변경하기 위한 함수이다. 재할당 받는 함수이다. 메모리의 크기를 크게하던 작게하던 상관은 없다. 다만 재 할당을 받아도 그전에 저장했던 내용은 저장이 된다.
char *p;
p = (char *)malloc(10 * sizeof(char)); // 초기화
p = realloc (p, 2*10 * sizeof(char)); // 초기크기 2배로 재설정
4. free
동적 메모리의 장점은 필요없을때 반환을 받을 수 있다. malloc으로 할당 받은 메모리를 반환 받고자 할때 이렇게 사용한다.
char *p;
p=(char *)malloc(1 0 * sizeof(char)); // 동적 할당
free(p); // 메모리 반환
5. 저장 공간 부족시 문제점
malloc으로 할당 한다고 해서 공간이 무한히 제공되는 것은 아니다.
그럴 경우 아래와 같이 추가해주면 문제를 해결할 수 있다.
int *ip;
ip = (int *)malloc(sizeof(int)); // heap에 저장 공간 없으면 0을 리턴
if(ip == 0)
{
pritnf("out of memory\n");
return 0; // main()이 아니면 exit(1);을 쓰도록 한다.
}
참고 : 포인터 변수 ip에 0을 넣을 경우 널포인트가 된다. 참조 불가!!
참고 : 2차 동적 배열 생성
int **ip;
int *man;
printf("반수 : ");
scanf("%d", &_class);
ip = (int **)malloc(_class*sizeof(int *));
man = (int *)malloc(_class*sizeof(int));
for(i=0; i<_class; i++)
{
printf("%d반 인원수 : ", i+1);
scanf("%d", man+i);
ip[i] = (int *)malloc((*(man+i))*sizeof(int));
}
- 2차 동적 배열을 파라메터로 함수에 넘길 경우
위의 동적 배열을 파라메터로 넘길 경우에는
ary(ip);
---------------------------------
void ary(int **p) // 같은 이차 포인터로 받는다
{
............
}
[프로그래밍/C] 전처리문의 종류(#include, #define, #ifdef, ... ) (0) | 2017.02.10 |
---|---|
[프로그래밍/C] #define (0) | 2017.02.10 |
[프로그래밍/C] 달력 알고리즘 (윤년계산) (0) | 2017.02.02 |
[프로그래밍/C] 날짜/시간 구하기 (0) | 2017.01.30 |
[프로그래밍/C] 일정관리프로그램 (4) | 2017.01.26 |