You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

std::memcmp遇到首个差异后是否会读取后续字节?

关于std::memcmp是否会提前终止的细节说明

先看你给出的代码示例:

constexpr char s1[] = "a";
constexpr char s2[] = "abc";
std::memcmp(s1, s2, 3);

你可能会直觉认为,如果memcmp在遇到第一个不同的字节时就停止,那它不会去读取s1第二个字节(空终止符)之后的内容——毕竟s1只有两个字节('a'加上末尾的'\0'),第三个字节已经超出数组范围了。但很遗憾,无论是C标准还是C++标准,都没有明确保证这种“提前终止”的行为。

我们可以看看C标准的定义(C++标准里memcmp的行为遵循C标准):

参考n1570文档7.24.4.1节:
int memcmp(const void *s1, const void *s2, size_t n);
memcmp函数比较对象指针指向的前n个字符的内容。

这里的描述重点是“比较前n个字符”,标准并没有规定实现必须在发现第一个差异后就停止操作。这意味着,从标准层面来讲,memcmp的实现完全有权限读取所有n个字节,哪怕前面已经找到差异了。所以在你的例子中,调用memcmp(s1, s2, 3)时,程序是有可能去读取s1的第三个字节的,这就属于数组越界访问,会触发未定义行为。

如果你想避免这种风险,最好确保传入的n值不超过两个数组中较小的那个长度,或者在调用memcmp前先处理好边界问题。

内容的提问来源于stack exchange,提问作者Ryan Haining

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:51:40