为什么两个地址之间的区别是错误的? http://codepad.org/NGDqFWjJ
#include<stdio.h>
int main()
{
int i = 10, j = 20;
int *p = &i;
int *q = &j;
int c = p - q;
printf("%d\n", p);
printf("%d\n", q);
printf("%d", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
-1083846364
-1083846368
1
Run Code Online (Sandbox Code Playgroud) 当我执行这个问题的代码时,我得到了这个警告:
warning: format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=]
printf("P-Q: %d, P: %d, Q: %d", (p - q), p, q);
~^ ~~~~~~~
%ld
Run Code Online (Sandbox Code Playgroud)
作为反射修复,我曾经%ld打印过两个指针的减法.编制者同意了.
幸运的是,我看到其他用户提到%td应该使用的评论,因为减法的结果类型是ptrdiff_t.这个答案证实了这一说法.
现在从GCC的stddef.h头文件中,我可以看到这些类型在这种情况下是等价的:
typedef __PTRDIFF_TYPE__ ptrdiff_t;
#define __PTRDIFF_TYPE__ long int
Run Code Online (Sandbox Code Playgroud)
但是,我只是建议对OP进行错误的(或多或少)修复%ld,而不是%td.
有没有一种方法我可以理解单独的编译器警告是不够的?或者也许明智地解释警告本身,而不仅仅是反应.
我无法理解为什么在这个程序2 - 4给出-1,它已经为指针而不是地址分配了int值,我知道但是当我编译它时编译器给出了一些警告,但编译了程序并执行但是...
程序
#include<stdio.h>
int main(void) {
int *p, *q;
int arr[] = {1,2,3,4};
// I know p and q are pointers and address should be assigned to them
// but look at output, why it evaluates (p-q) to -1 while p as 2 and q as 4
p = arr[1];
q = arr[3];
printf("P-Q: %d, P: %d, Q: %d", (p - q), p, q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给
P-Q: -1, P: 2, Q: 4
Run Code Online (Sandbox Code Playgroud)