728x90
반응형

이번에는 c언어에서 메모리와 관련된 함수가 어떤 것이 있는지 알아보았다.

 

메모리와 관련된 함수는 2가지의 헤더 파일을 통해 사용할 수 있었다.

 

[ stdlib.h 헤더파일 ]

void * malloc ( size_t size ); 	size 바이트의 메모리를 힙에서 할당하여 반환한다.
void * calloc ( size_t num, size_t size );	(num * size) 바이트의 메모리를 힙에서 할당하여 반환한다. 메모리를 할당할 때 모든 값을 0으로 초기화한다.
void * realloc ( void * ptr, size_t size );	ptr이 가리키는 메모리를 size 바이트만큼 힙에서 재할당하여 반환한다.
void free ( void * ptr );		ptr이 가리키는 메모리를 해제한다.(할당했으면 반드시 해제해야 한다.)

 

[ string.h 헤더파일 ]

void * memcpy ( void * destination, const void * source, size_t num );
source가 가리키는 곳 부터 num바이트 만큼을 destination이 가리키는 곳에 복사한다.

void * memmove ( void * destination, const void * source, size_t num );
source가 가리키는 곳 부터 num바이트 만큼을 destination이 가리키는 곳으로 옮긴다. 버퍼를 사용하기 때문에 범위가 겹쳐도 문제가 없다.

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
ptr1이 가리키는 처음 num바이트의 데이터와 ptr2가 가리키는 처음 num바이트의 데이터를 비교한다.

void * memchr ( const void * ptr, int value, size_t num );
ptr이 가리키는 메모리의 처음 num바이트 중에서 처음으로 value와 일치하는 값(문자)의 주소를 반환한다.

void * memset ( void * ptr, int value, size_t num );
ptr이 가리키는 메모리의 처음 num바이트를 value값(문자)으로 채운다.

 

 

각각의 함수들을 직접 사용해보았다.

 

[ malloc, calloc, free ]

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *mal;  // int형 포인터 선언
    int *cal;  // int형 포인터 선언
    int *real; // int형 포인터 선언

    // mallo(): int의 크기 4바이트만큼 메모리 동적 할당
    mal = malloc(sizeof(int));

    // calloc(): int의 크기 4바이트 * 2 만큼 메모리 동적 할당
    cal = calloc(2, sizeof(int));

    printf("mal의 주소: %p\n", mal);
    printf("cal의 주소: %p\n", cal);

    // 메모리 동적 할당 해제
    free(mal);
    free(cal);

    return 0;
}

 

 

[ realloc, free ]

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *real; // int형 포인터 선언

    // int의 크기 4바이트 * 5만큼 메모리 동적 할당
    real = malloc(sizeof(int)*5);

    // 할당된 크기를 초과하게되면 에러가 발생한다.
    for (int i=0; i<5; i++) {
        *(real+i) = i;
        printf("%d\t", *(real+i));
    }
    printf("\n");

    // realloc(): 메모리의 크기를 4바이트 * 10 만큼 메모리 재할당
    real = realloc(real, sizeof(int)*10);

    for (int i=0; i<10; i++) {
        *(real+i) = i;
        printf("%d\t", *(real+i));
    }
    printf("\n");

    // 메모리 동적 할당 해제
    free(real);

    return 0;
}

 

 

[ memcpy ]

#include <stdio.h>
#include <string.h>

int main(void) {

    char cpy_src[5] = "hello";
    char cpy_dest[5];

    // 문자열 cpy_src 의 3번째 문자까지 복사한다.
    memcpy(cpy_dest, cpy_src, 3);

    printf("%s\n", cpy_dest);

    return 0;
}

 

[ memmove ]

#include <stdio.h>
#include <string.h>

int main(void) {

    char move_src[12] = "boostcourse";
    char move_dest[20] = "hello, ............";

    // move_src 의 11번째 부분까지의 문자열을
    // move_dest의 7번째 부분부터 복사하라는 말이다.
    memmove(move_dest+7, move_src, 11);

    printf("%s\n", move_dest);

    return 0;
}

 

[ memcmp ]

#include <stdio.h>
#include <string.h>

int main() {
    char str1[256];
    char str2[256];
    int n;
    size_t len1, len2;

    printf("Enter a sentence: ");
    scanf("%s", str1);

    printf("Enter another sentence: ");
    scanf("%s", str2);

    len1 = strlen(str1);
    len2 = strlen(str2);

    n = memcmp(str1, str2, len1 > len2 ? len1 : len2);

    if (n > 0) {
    printf("'%s' is greater than '%s'.\n", str1, str2);
    } else if (n < 0) {
    printf("'%s' is less than '%s'.\n", str1, str2);
    } else {
    printf("'%s' is the same as '%s'.\n", str1, str2);
    }
    return 0;
}

 

[ memchr ]

#include <stdio.h>
#include <string.h>

int main() {
    char* chr;
    char str[] = "hello, boostcourse!";

    // 문자열 str에서 처음으로 일치하는 '!' 의 위치를 알려준다.
    chr = (char*)memchr(str, '!', strlen(str));

    if (chr != NULL)
        printf("'!' found at position %ld.\n", chr - str + 1);
    else
        printf("'!' not found.\n");

    return 0;
}

 

[ memset ]

#include <stdio.h>
#include <string.h>

int main() {
  char str[] = "almost every programmer should know memset!";

  // 문자열 str 에서 6번째 자리까지 '-' 로 채운다.
  memset(str, '-', 6);

  printf("%s\n", str);

  return 0;
}

 

 

 

- 참고 사이트 - 

dojang.io/mod/page/view.php?id=285

 

C 언어 코딩 도장: 35.1 메모리 할당하기

메모리를 사용하려면 malloc 함수로 사용할 메모리 공간을 확보해야 합니다(memory allocation). 이때 필요한 메모리 크기는 바이트 단위로 지정합니다(메모리 할당, 해제 함수는 stdlib.h 헤더 파일에 선

dojang.io

jeckl.tistory.com/entry/C%EC%96%B8%EC%96%B4-23%EA%B0%95-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%9D%98-%EB%8F%99%EC%A0%81%ED%95%A0%EB%8B%B9-malloc-calloc-realloc-free

 

([C언어] 23강) 메모리의 동적할당 (malloc, calloc, realloc, free)

안녕하세요 잭클입니다. 이번시간에는 메모리의 동적할당에 대해 배워볼까 하는데요! 우선 우리가 배열은 포인터다 라는 개념을 알고있으니 int arr[4]; int * ptrArr = arr; 이 코드의 의미를 알고있을

jeckl.tistory.com

modoocode.com/104

 

C 언어 레퍼런스 - memset 함수

 

modoocode.com

 

 

728x90
반응형
복사했습니다!