在 C/C++ 编程中,从较小的地址中减去较大的地址时,输出表示什么?

vik*_*ngh 1 c c++ memory gcc pointers

给定一段代码:

int a[5];
printf("%u\n",&a[3]-&a[0]);
printf("%u",&a[0]-&a[3]);
Run Code Online (Sandbox Code Playgroud)

现在,地址减法中第一行的输出是根据公式((addg - add)/数据类型的大小),其中 addg 大于 add。gcc 中上述代码段的输出是:

3
4294967293
Run Code Online (Sandbox Code Playgroud)

第一行输出(即 3)很明显,但是第二个输出的含义是什么,或者从较小的地址中减去较大的地址(即添加 - addg)时会发生什么?

Adr*_*ica 6

您的代码中的问题是您有未定义的行为。不是因为指针算术,而是因为您使用格式说明符打印有符号整数%u。更改%td格式(t指定“指针差异”类型),您将看到更有意义的结果:

#include <stdio.h>
#include <stddef.h>

int main()
{
    int a[5];
    printf("%td\n", &a[3] - &a[0]); // Shows "3"
    printf("%td", &a[0] - &a[3]);   // Shows "-3"
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

从这个C11 标准草案(第6.5.6节第 #9 段)(我的粗体):

两个指针相减时,都指向同一个数组对象的元素,或者指向数组对象最后一个元素后的一个;结果是两个数组元素的下标之差。结果的大小是实现定义的,它的类型(有符号整数类型ptrdiff_t<stddef.h> 头文件中定义...