【问题标题】:C: long pointer pointing to address with an integerC: 长指针指向一个整数地址
【发布时间】:2018-03-25 19:21:05
【问题描述】:

为什么第一个 printf() 输出 1,第二个输出 8589934593? 编辑:为什么第二个输出正好是 8589934593 而不是其他数字?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    int *intPtr = NULL;
    long *longPtr = NULL;

    int array[5] = {0,1,2,3,4};
    intPtr = &array[1];
    longPtr = &array[1];
    printf("%d\n", *intPtr);
    printf("%ld\n", *longPtr);
}

【问题讨论】:

标签: c pointers printf


【解决方案1】:

因为它是未定义的行为。将long* 指向int 的地址并表现得像long 违反了严格的别名规则,给您带来未定义的行为。

【讨论】:

  • 但是为什么输出的是 8589934593 而不是其他的数字呢?
  • @AndrejCoding 因为它是未定义的,它可以打印任何东西或炸毁你的电脑。
  • 所以对于某些编译器,它可以输出例如123还是什么?它只是为我的特定编译器输出 8589934593,因为编译器在某处定义了它?
  • @AndrejCoding 这是因为在您运行它时,这正是您计算机上该地址的内存中发生的事情。如果你稍后再次运行它,你可能会得到不同的结果,或者如果你改变了一些导致编译器使用不同地址的东西,等等。
  • 以十六进制打印&gt;&gt;&gt; hex(8589934593 ) '0x200000001'。现在您确定编译器会通过移位或其他方式读取数据。
猜你喜欢
  • 2016-08-11
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
相关资源
最近更新 更多