相关疑难解决方法(0)

指针/地址差异

为什么两个地址之间的区别是错误的? 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)

c pointers pointer-arithmetic

8
推荐指数
2
解决办法
1万
查看次数

如何明智地解释这个编译器警告?

当我执行这个问题的代码时,我得到了这个警告:

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.

有没有一种方法我可以理解单独的编译器警告是不够的?或者也许明智地解释警告本身,而不仅仅是反应.

c types pointers compiler-warnings pointer-arithmetic

6
推荐指数
1
解决办法
142
查看次数

(2 - 4 = -1)当int值分配给C中的指针时?

我无法理解为什么在这个程序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)

c pointers pointer-arithmetic

2
推荐指数
2
解决办法
200
查看次数