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
相关产品推荐
相关产品推荐

