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)时会发生什么?
您的代码中的问题是您有未定义的行为。不是因为指针算术,而是因为您使用格式说明符打印有符号整数%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>头文件中定义...
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |