【发布时间】:2026-01-30 10:10:02
【问题描述】:
我在编译器升级后遇到了一条新的警告消息。
警告:指针与整数零的有序比较 [-Wextra]
if (inx > 0)
事实证明 inx 是一个指针。通常我希望看到这个旧代码与 0 或 NULL 进行比较。这让我开始思考有符号和无符号值,以及可能的风险。
一些研究表明:
- A pointer greater than zero in c++, what does mean?
- Can a pointer (address) ever be negative?
- memory address positive or negative value in c?
- malloc returns negative value
这些似乎表明地址(由 malloc 返回)永远不能为零
这将我带到了我的旧标准副本。
4.10 指针转换
1 空指针常量是整数类型的整数常量表达式 (5.19) prvalue,其计算结果为零 或 std::nullptr_t 类型的纯右值。空指针常量可以转换为指针类型;结果 是该类型的空指针值,并且可以与指向对象或指针的所有其他值区分开来 指向函数类型的指针。这种转换称为空指针转换。的两个空指针值 相同类型应比较相等。将空指针常量转换为指向 cv 限定类型的指针是 单个转换,而不是指针转换后跟限定转换 (4.4) 的序列。 整数类型的空指针常量可以转换为 std::nullptr_t 类型的纯右值。
它明确指出两个空指针比较相等。
考虑到这一点,那一小段代码是未定义的行为吗?还是我错过了另一个难题?
【问题讨论】:
-
当你
if (inx == 0)时你的编译器会告诉你什么? -
部分问题在于
0在源代码中 表示的是NULL 指针。但是,NULL 指针可能不会作为 0在内存中存储。它可以是 0xFFFFFFFFFFFFFFFF 或任何其他值。由于 NULL 的 实际 值未指定,因此所有与它的比较也是如此。