스터디&교육/부스트코스 CS50 2기
부스트코스(Boostcourse) CS50 5주차 심화 과정 💎 생각해보기(4)
남제이입니다!
2021. 2. 19. 22:00
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
([C언어] 23강) 메모리의 동적할당 (malloc, calloc, realloc, free)
안녕하세요 잭클입니다. 이번시간에는 메모리의 동적할당에 대해 배워볼까 하는데요! 우선 우리가 배열은 포인터다 라는 개념을 알고있으니 int arr[4]; int * ptrArr = arr; 이 코드의 의미를 알고있을
jeckl.tistory.com
C 언어 레퍼런스 - memset 함수
modoocode.com
728x90
반응형