c - C中最大和最小指针地址

标签 c memory-address

假设我有全局变量:

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_tuintptr_t (在 <stdint.h> 中定义)并在不丢失信息的情况下再次返回。自 intptr_tuintptr_t是整数类型,它们的减法和比较定义明确——但这并不意味着比较对指针值有任何意义。当然减法会溢出。

您可以接受您的代码行为未由标准定义的事实(尽管它可能恰好在您的系统上运行),或者您可以找到其他方法来解决您的问题。对于后者,如果您告诉我们您要解决的问题,我们可能会提供帮助。

关于c - C中最大和最小指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19625357/

相关文章:

尝试显示指针值和指针地址时代码未运行

c - 在 C 文件中单独使用一个内联函数是否相关?

c - 数组中地址差异的歧义

c - 这行代码是什么意思?

c++ - I/O 流操纵器 - 内部调整域 - C++ 与 C

c++ - &a[x] 在 C 中返回什么类型的值

c# - C#读取指针地址值

c 打印指针指向的数组的地址

控制台输出以错误的顺序出现

c - wget 命令将输入​​作为文件,并且文件必须包含 url 和字符串参数