【问题标题】:Unable to understand output in C无法理解 C 中的输出
【发布时间】:2018-01-18 15:07:10
【问题描述】:

我正在学习 C 中的指针,并在 GCC 编译器中尝试了这个程序。
当我尝试p-q 时,它给出 1 作为输出(因为 int 需要 4 个字节,p 和 q 的值分别为 2358844 和 2358840,因此 1 作为输出,因为 p-q 提供 4 之后的 1*4=4 个字节) .
但是一旦我尝试q-p,它就会给出 4294967295 作为输出。它应该给出 -1 作为输出,但我无法理解它为什么给出另一个输出。

这是我的程序。

#include<stdio.h>
#include<conio.h>
void main()
{
    int a=5,b=6;
    int *p,*q;
    p=&a;
    q=&b;
    printf("p = %u",p);
    printf("\nq = %u",q);
    printf("\nq-p = %u",q-p);
    getch();
} 

【问题讨论】:

  • 从技术上讲,您的程序表现出未定义的行为。您应该使用"%p" 格式来打印指针。
  • 此外,您只能减去指向同一数组元素的指针。 p 和 q 没有,所以 q - p 也是未定义的。
  • %p 给了 F 16 次。我改用 %d。
  • 有点相关:stackoverflow.com/q/7954439/5265292 在那里,您可以了解有关指针测试的正确类型和格式字符串的一些知识...严格来说,结果可能仍然是未定义的行为,因为您的两个 int 不是一部分相同的数组(但我不是 100% 确定)
  • @vivekbhardwaj 谁或什么文字建议使用"%u" 打印指针?

标签: c pointers


【解决方案1】:

4294967295 是 FFFFFFFF 或 -1 作为有符号值。您正在使用 %u

将其打印为未签名

【讨论】:

  • 谢谢。我用 %d 代替 %u,它给出了想要的输出。
  • @vivekbhardwaj 这似乎是正确的答案,您已经说过它适合您,除非您正在等待其他答案,否则您应该继续接受它。
  • @Scheme 从技术上讲,这不是正确的答案。 %u 和 %d 都不适用于打印指针之间的差异
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2013-12-23
  • 1970-01-01
  • 2016-12-07
相关资源
最近更新 更多