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

memcmp函数是否被保证按顺序逐字节进行比较?

memcmp是否被保证按顺序比较字节?

问题描述

假设我有一个指向以空字符结尾的字符串的指针pString,尝试用memcmp和另一个字符串比较,示例代码如下:

bool eq = memcmp(pString, "test", sizeof("test")) == 0;

pString可能位于虚拟页面的末尾,后续页面未分配,比如:

char c1 = pString[0]; // 'x'
char c2 = pString[1]; // '\0'
char c3 = pString[2]; // 触发访问违规

这种场景下,如果memcmp不按顺序比较字节,程序可能崩溃。我的问题是:memcmp是否被保证按顺序比较字节?

编辑说明:我知道strcmp的存在,上述示例仅用于阐明问题,实际问题请参考标题。

回答

根据C语言标准,memcmp被明确要求按从低地址到高地址的顺序,逐个比较两个内存区域的字节,并且一旦发现第一个不相等的字节,就会立即停止后续的比较操作,不会再访问后续的内存地址。

回到你的场景:如果pString的前几个字节就和"test"对应位置的字节不相等,memcmp会在发现差异时立刻停止,不会去访问那些未分配页面的内存;即便需要比较到pString的末尾空字符,只要在非法内存地址之前就找到差异,程序就不会触发访问违规。

需要注意的是:如果你指定的比较字节数超过了pString指向的合法内存范围,且所有前N个合法字节都和目标字符串对应字节相等,那么memcmp最终还是会尝试访问非法内存地址,这时候无论比较顺序如何都会触发错误——但这种情况属于代码本身的逻辑问题,和memcmp的比较顺序无关。

总结关键结论:

  • memcmp的比较顺序是严格从低到高逐个字节进行的,这是C标准强制要求的,所有合规实现都必须遵守。
  • 顺序比较的特性保证了在发现第一个字节差异时及时终止,尽可能避免访问非法内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:21:19