int memcmp(const void* ptr1, const void* ptr2, size_t count);
매개변수(인자)
const void* ptr1 = 비교 대상1
const void* ptr2 = 비교 대상2
size_t count = 비교할 크기 (바이트)
반환값(리턴값)
(ptr1 > ptr2) = 1 반환
(ptr1 < ptr2) = -1 반환
(ptr1 == ptr2) = 0 반환
설명
* ptr1과 ptr2를 count 바이트만큼 비교한다.
* 널문자를 만나도 계속 진행한다. (strcmp면 멈췄을 것)
* count가 비교 대상의 크기보다 크다면? = 정의되지 않음
* ptr1 or ptr2가 NULL이라면? = 정의되지 않음
구조체를 비교할 때 유용하다 (Byte Padding은 문제가 있나)
* 구조체도 배열처럼 생겼으니 memcmp를 사용해 값의 비교를 할 수 있다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
typedef struct {
char char1;
int int1;
char char2;
int int2;
char char3;
char char4;
int int3;
}struct_t;
printf("구조체의 크기는 %d \n", sizeof(struct_t));
struct_t a1 = { 'a', 100, 'a', 1000, 'a', 'a', 100 };
struct_t a2 = { 'a', 100, 'a', 1000, 'a', 'a', 100 };
int result = memcmp(&a1, &a2, sizeof(struct_t));
printf("결과는 %d", result);
}
* 혹시 byte padding이 생기면 비교하는데 문제가 생기지는 않을까...?
해서 구조체 a1과 a2의 메모리를 확인해보았다.
* 결과는 깔끔하다! 바이트 패딩은 모두 cc가 들어가 있다. memcmp 함수를 사용하는데 지장이 없다.
예제
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char char1 = 'a';
char char2 = 'b';
int result = memcmp(&char1, &char2, sizeof(char));
printf("%c와 %c의 비교 = %d\n", char1, char2, result);
int int1 = 100;
int int2 = 10;
result = memcmp(&int1, &int2, sizeof(int));
printf("%d와 %d의 비교 = %d\n", int1, int2, result);
float float1 = 3.14;
float float2 = 3.14;
result = memcmp(&float1, &float2, sizeof(float));
printf("%f와 %f의 비교 = %d", float1, float2, result);
}
귀여운 그림은 쭐어님이 그리셨습니다.
반응형
'C' 카테고리의 다른 글
extern 키워드 (0) | 2021.02.02 |
---|---|
동적 메모리 할당에 관한 규칙, 권장 (0) | 2020.12.30 |
free 함수 (0) | 2020.12.28 |
realloc 함수와 memcpy 함수 (0) | 2020.12.27 |
memset 함수 (0) | 2020.12.26 |