---
name: "memcmp"
section: "3"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/memcmp"
---

# memcmp(3)

memory compare

## NAME

memcmp - memory compare

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <string.h>  // see memory.h(3head)
```

**int memcmp(**size\_t n;            **const void** *s1***\[***n***\], const void** *s2***\[***n***\], size\_t** *n***);**

## DESCRIPTION

The **memcmp**() function compares the first *n* bytes (each interpreted as *unsigned char*) of the memory areas *s1* and *s2*.

## RETURN VALUE

The **memcmp**() function returns an integer less than, equal to, or greater than zero if the first *n* bytes of *s1* is found, respectively, to be less than, to match, or be greater than the first *n* bytes of *s2*.

For a nonzero return value, the sign is determined by the sign of the difference between the first pair of bytes (interpreted as *unsigned char*) that differ in *s1* and *s2*.

If *n* is zero, the return value is zero.

## ATTRIBUTES

For an explanation of the terms used in this section, see [**attributes**(7)](/attributes/7.md).

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **memcmp**() | Thread safety | MT-Safe |

## VERSIONS

POSIX.1 specifies only that:

The sign of a nonzero return value shall be determined by the sign of the difference between the values of the first pair of bytes (both interpreted as type *unsigned char*) that differ in the strings being compared.

In glibc, as in most other implementations, the return value is the arithmetic result of subtracting the last compared byte in *s2* from the last compared byte in *s1*. (If the two characters are equal, this difference is 0.)

## STANDARDS

C11, POSIX.1-2008.

## HISTORY

POSIX.1-2001, C89, SVr4, 4.3BSD.

## CAVEATS

Do not use **memcmp**() to compare confidential data, such as cryptographic secrets, because the CPU time required for the comparison depends on the contents of the addresses compared, this function is subject to timing-based side-channel attacks. In such cases, a function that performs comparisons in deterministic time, depending only on *n* (the quantity of bytes compared) is required. Some operating systems provide such a function (e.g., NetBSD's **consttime\_memequal**()), but no such function is specified in POSIX. On Linux, you may need to implement such a function yourself.

## SEE ALSO

[**memory.h**(3head)](/memory.h/3head.md), [**memeq**(3)](/memeq/3.md), [**wmemcmp**(3)](/wmemcmp/3.md)
