使用memcmp比较两个无关指针是否属于C语言未定义行为?
无关指针用memcmp比较是否属于未定义行为?
先明确两个基础规则:
- 直接对无关指针(即不指向同一数组或同一对象的指针)做算术比较(
</>等)属于未定义行为,示例代码如下:
int a, b; bool ub = &a < &b; // 此处为未定义行为
- 将指针转换为
uintptr_t类型后再比较是完全合法的,标准明确保证这种转换和后续比较的行为是确定的:
int a, b; bool not_ub = (uintptr_t)&a < (uintptr_t)&b; // 合法,行为可预期
核心问题分析:用memcmp比较无关指针的合法性
先看示例代码:
int a, b; int* pa = &a; int* pb = &b; int maybe_ub = memcmp(&pa, &pb, sizeof(int*)); // 这行是否属于未定义行为?
根据C11标准§7.24.4.1的规定:
memcmp函数比较s1指向对象的前n个字符与s2指向对象的前n个字符。
这里的关键是:memcmp操作的不是指针本身指向的内容,而是两个指针变量自身的内存表示——&pa和&pb指向的是两个独立的int*类型变量(也就是pa和pb这两个指针变量自己),这两个变量都是合法的局部对象,完全满足memcmp的参数要求:
&pa和&pb都是指向有效对象的指针sizeof(int*)是这两个对象的准确大小,memcmp会逐字节对比它们的二进制内容
因此,这个memcmp调用不属于未定义行为,它的行为是标准明确规定的:逐字节对比两个指针变量的内存内容,返回对应的比较结果。
需要额外说明的是:C标准并没有规定指针的内存表示必须对应线性地址或有其他特定含义,所以memcmp的结果可能没有实际业务价值,但这和"未定义行为"是完全不同的概念——只要行为是标准明确界定的,哪怕结果不可预测,也不属于UB。
内容的提问来源于stack exchange,提问作者zdimension
相关产品推荐
相关产品推荐

