2016년 2월 12일 금요일

C언어 고급포인터: 동적메모리 함수

배열을 사용자가 사용할 때 입력할 개수를 정해야 할 때가 있다.
배열의 메모리10000개 잡아놨을 때 aa[10000] 이중에 5개만 쓸 경우 나머지 9995개는 쓸데 없이 낭비가 되는 것이다. 메모리를 적절하게 사용하기위해
메모리를 미리 잡아두지않고, 필요할 때마다 확보하는 것을 동적메모리 확보라고 한다. 이때 사용하는 함수가 malloc()이다.  이때 헤더는 #include<malloc.h>이다.
malloc는
포인터 변수 = ( 포인터 변수의 데이터형*)malloc(포인터 변수의 데이터형 크키 * 필요한 크기)
ex)
include<stdio.h>
include<malloc.h>

int main()
{
     int *p;
     int i,hap=0;
     int cnt;

     printf("입력할 개수는?");
     scanf("%d",&cnt);  
    
     p=(int*)malloc(4*cnt);  // 데이터형의 크기를 모를시 4대신에 sizeof(int)를 사용 가능
    
     for(i=0;i<cnt;i++)
     {
          printf("%d 번째 숫자는?",i+1);
          scanf("%d",&*(p+i));
     }
    
     for(i=0;i<cnt;i++)
          hap= hap+ (p+i);

     printf("입력 숫자의 합 ==> %d \n", hap);

     free(p);
}
출처 : c언어 기초   우재남 저자   한빛미디어 출판사
이렇게 메모리를 유동적으로 만들 수 있다.

또한  malloc()를 사용 했다면 free() 함수도 같이 써서 사용 했던 메모리를 다시 운영체제에 반납한다. free()는 널(null)값을 넣는다는 뜻이다.

이외에도 calloc(), realloc()함수를 사용하는 경우도 있다.
malloc() 함수는 메모리를 확보한 후 초기화를 하지 않기 때문에 최초에는 쓰레기값이 들어가 있다. 처음부터 0으로 초기화된 메모리를 확보하고 싶다면 calloc()함수를 사용한다.

realloc()함수는 최초로 확보한 메모리 크기를 변경 할 때 사용한다.
포인터 변수 =(포인터 변수의 데이터형*)realloc(기본 포인터,포인터 변수의 데이터형 크기 * 필요한 크기)

realloc()는 반복문에 사용하여 계속 필요한 크기를 변경 할 수 있다. malloc or calloc은 한 번 정해지면 바꿀 수 없다.

댓글 없음:

댓글 쓰기