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
728x90
반응형
'스터디&교육 > 부스트코스 CS50 2기' 카테고리의 다른 글
부스트코스(Boostcourse) CS50 코칭스터디 2기 수료 후기 😆 (2) | 2021.03.04 |
---|---|
[부스트코스 CS50] 6주차 심화 과정 💎 생각해보기 (0) | 2021.02.25 |
부스트코스(Boostcourse) CS50 5주차 심화 과정 💎 생각해보기(3) (0) | 2021.02.19 |
부스트코스(Boostcourse) CS50 5주차 심화 과정 💎 생각해보기(2) (0) | 2021.02.19 |
부스트코스(Boostcourse) CS50 5주차 심화 과정 💎 생각해보기(1) (0) | 2021.02.19 |