假设我有全局变量:
char *min_ptr, *max_ptr;
和函数:
void f(int *p)
{
if(min_ptr > p)
min_ptr = p;
if(max_ptr < p)
max_ptr = p;
}
如果 C 不保证地址的存储方式与 unsigned long 相同,我想我不能按如下方式初始化我的变量:
char *min_ptr = ULONG_MAX, *max_ptr = 0;
如何将 min_ptr 和 max_ptr 分别初始化为最小地址和最大地址?将 <、>、<= 或 >= 运算符与指针一起使用是否有效?
最佳答案
指针减法或指针比较使用 <
, <=
, >
, 或 >=
具有未定义的行为,除非两个指针都指向同一个数组对象的元素,或者刚好超过它的末尾。 (为此,单个对象被视为单元素数组。)关系运算符比较数组索引,减法产生元素的差异(例如 &arr[5] - &arr[2] == 3
)。
它可能在大多数系统上“有效”(即,或多或少地为您提供一致的结果),但如果存在对齐问题,减法可能仍会产生无意义的结果。
您可以将任何指向对象的指针值转换为 intptr_t
或 uintptr_t
(在 <stdint.h>
中定义)并在不丢失信息的情况下再次返回。自 intptr_t
和 uintptr_t
是整数类型,它们的减法和比较定义明确——但这并不意味着比较对指针值有任何意义。当然减法会溢出。
您可以接受您的代码行为未由标准定义的事实(尽管它可能恰好在您的系统上运行),或者您可以找到其他方法来解决您的问题。对于后者,如果您告诉我们您要解决的问题,我们可能会提供帮助。
关于c - C中最大和最小指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19625357/