본문 바로가기

카테고리 없음

malloc calloc realloc free

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(10 * 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)     // 같은 이차 포인터로 받는다 
{
............
}