以下c程序的输出是1.有人可以解释一下吗?
#include<stdio.h>
#include<string.h>
int main(){
int a = 5,b = 10,c;
int *p = &a,*q = &b;
c = p - q;
printf("%d" , c);
return 0;
}
答案 0 :(得分:7)
程序调用未定义的行为。指针减法必须使用指向同一数组元素的指针来完成。
来自C标准:
(C99,6.5.6p9)“当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素[...]”
答案 1 :(得分:0)
变量在堆栈中一个接一个地分配。在具有4字节大小的整数的机器上说地址可以说是1000和1004;差别是4个字节;指针运算表明差异应该返回元素中的值(而不是字节),因此地址之间的元素数(int)是1(整数)。
但是,这仅在同一个数组中或在它之后的一个元素中有效,这在您的示例中并非如此,因此未定义。
C ++11§5.7/ 6 :
当减去指向同一数组对象的元素的两个指针时, 结果是两个数组的下标的差异 elements ...除非两个指针都指向同一个数组的元素 对象,或者是数组对象的最后一个元素之后的行为 未定义。
编辑:谢谢你让我在这个问题上查找C ++标准。
答案 2 :(得分:0)
使用int
指针算术作为计量单位,返回两个连续堆栈分配指针的内存位置差异。
从技术上讲,程序行为是 undefined 。因此,再说毫无意义。