【问题标题】:Please explain the ouput [closed]请解释输出[关闭]
【发布时间】:2014-09-24 21:28:44
【问题描述】:
#include <stdio.h>

int main() {
    int a[4] = {1, 2, 3, 4};
    int b[4] = {1, 2, 3, 4};
    int n = &b[3] - &a[2];
    printf("%d\n", n);
}

这个问题的输出是-3,谁能解释一下这是怎么回事?

【问题讨论】:

  • 我想这就是你想要做的? int n = b[3] - a[2];
  • 我相信这实际上有点有趣。也许如果您可以在问题中添加更多详细信息并选择适当的标题,就可以了。
  • 你减去的是地址,而不是值

标签: c


【解决方案1】:

减去“不相关”的指针,即指向不同对象的指针是未定义的。

C11-6.5.6-9

当两个指针相减时,两个指针都指向 相同的数组对象,或数组对象的最后一个元素;

【讨论】:

  • 从实际的角度来看,b 的布局很可能是为了使其结尾正好位于a 的开头。当然,你不能指望它。
  • @chris a 也有可能在 b 开始的地方结束。
【解决方案2】:

&amp;b[3]是指向b中第4个元素的指针,&amp;a[2]是指向a中第3个元素的指针。 n 将是每个相应指针指向的内存之间的内存空间。

我不知道您是否可以指望结果值 (-3) 对于所有编译器都相同。两个数组a 和b 不保证在内存中相互有任何关系。

如果您想计算b[3] 和a[2] 的值之间的差异,代码将是:

int n = b[3] - a[2];

应该给出1的结果。

【讨论】:

  • 你不能依赖它,因为它是UB。
【解决方案3】:

代码的输出取决于机器。您正在减去元素的地址。每次执行程序可能都不一样

【讨论】:

  • 它不是机器,而是依赖于实现。尝试使用新旧编译器(最适合不同的寻址模式),您可能会在同一台机器上得到截然不同的结果。无论如何,它是 UB,因此您可能会在第二次运行时使用相同的实现得到不同的结果。
【解决方案4】:

这是正常的,因为您使用的是地址

如果您需要结果为 1 而不是使用这样的值

int n = b[3] - a[2];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2014-02-17
    相关资源
    最近更新 更多