반응형
SMALL

9.4 기타 동적 할당 함수

9.4.1 calloc() 함수 

- malloc()함수와 동일하게 힙 영역에 기억 공간 할당

- 다른 점은 사용하는 형태와 할당된 기억 공간을 0으로 초기화

> 형식 : void *calloc(int n, int size);

> 기능 : 주어진 size의 크기를 가지는 기억 공간 n개를 할당 받는다.

> 사용 예 : void *calloc(n, sizeof(int));

 

//calloc() 함수의 사용 예

#include <stdio.h>

#include <stdlib.h>

void main(){

   int i;

   int *a;

   a = (int*)calloc(5, sizeof(int));

     for(i=0; i <5; i++) {

          printf("%d \n", a[i];   }    free(a);   }

 

9.4.2  realloc() 함수

- 이미 할당 받은 기억 공간의 크기를 변경해야 할 필요가 있을 경우에 사용

> 형식 : void * realloc(void *p, int size);

> 기능 : 포인터 p가 가리키고 있는 기억공간의 크기를 지정된 size의 크기로 변경

[ realloc() 함수의 사용 예 ]

int *a;
   a = (int*)calloc(5, sizeof(int));         // int형 크기의 기억공간을 5개 할당
               .....
   a = (int*)realloc(a, 10*sizeof(int));    // int형 크기의 기억공간을 10개 재할당
               .....

 

 

9.5 기억공간 관리

 

9.5.1.  memcmp() 함수 

- 기억공간에 들어 있는 자료를 주어지는 크기만큼 비교하여, 같은지 여부를 알 수 있게 해주는 함수

> 형식 : int memcmp(void *s1, void *s2, size_t n);

> 기능 : s1 과 s2가 가리키는 기억 공간의 내용을 n byte 만큼 비교

 

//memcmp() 함수의 사용 예

#include <stdio.h>

#include <string.h>     // memcmp() 함수 원형 선언

void main(){

     char *s1 = "aaab";

     char *s2 = "aaac";

     int stat;

     stat = memcmp(s1, s2, 3);   // 3자리까지는 같으므로 0을 반환함

     printf("%d", stat);    } 

 

 

9.5.2. memcpy() 함수

- 기억 공간의 자료를 다른 기억 공간 영역으로 복사하기 위한 함수

> 형식 : void *memcpy(void *dest, const void *src, size_t n);   // dest : 목적지 기억공간의 포인터

> 기능 : src에서 n byte만큼 dest에 복사   // src : 복사할 것의 기억공간의 포인터,  n : 복사하려는 byte 수

 

// memcpy() 함수의 사용 예

#include <stdio.h>

#include <string.h>

void main(){

   char src[] = "1230567890";

   char dest[] = "abcdefghijklmnopqrstuvwxyz";

   char *stat;

   printf("memcpy() 실행 전 dest의 데이터 : %s \n", dest);

   stat = (char *)memcpy(dest, src, strlen(src));

   if(stat)

      printf("memcpy() 실행 후 dest의 데이터 : %s \n", dest);

   else 

      printf("복사 실패 \n");   }

 

 

9.5.3. memset() 함수

- 기억 공간의 자료를 지정한 문자로 채우는 함수

- 할당된 기억 공간의 초기화나 내용 삭제를 위해 주로 사용

> 형식 : void *memset(void *s, int c, size_t n);

> 기능 : 포인터 s가 가리키는 곳을 c값으로 n byte 만큼 채운다.

 

// memset() 함수의 사용 예

#include <stdio.h>

#include <string.h>

void main() {

   char s[] = "1230567890";

   printf("memset() 실행 전 s의 데이터 : %s \n", s);

   memset(s, '*', strlen(s));

   printf("memset() 실행 후 s의 데이터 : %s \n", s);  }

 

 

 

9.5.4 문자열 처리 함수와 기억공간 관리 함수

기억공간 과리 함수와 문자열 관련 함수는 많은 공통점이 있다.

문자열과 기억공간은 연속된 공간이라는 점에서 공통점이 있으므로 기억공간 관리 함수의 동작도 문자열처리함수와 비슷하다. 

문자열을 복사하는 함수인 strcpy() 함수에 대응되는 memcpy() 함수,

문자열 비교를 위한 함수 strcmp() 함수에 대응되는 memcpy() 함수 등 기본 동작 방식은 같다고 생각하면 된다.

 

기억 공간 과리 함수와 문자열 처리 함수의 차이점은 다음과 같다.

 

(1) 인수와 리턴값의 타입

 기억공간 관리 함수는 임의의 자료를 대상으로 하므로 인수와 리턴값이 모두 void형

 문자열 처리 함수는 항상 문자열을 대상으로 하므로 인수나 리턴값이 대부분 char형

 

(2) 함수 실행 후 종료 시점

 문자열은 시작 주소만 알려주면 null('\0')을 통해 끝을 인식하므로  문자열의 길이를 별도로 알려줄 필요없다.

 기억공간 관리 함수는 크기를 알려주지 않으면 실행의 끝을 모른다. 

반응형
LIST

+ Recent posts