【问题标题】:Addition of unsigned long and int in C [duplicate]在 C 中添加 unsigned long 和 int [重复]
【发布时间】:2016-04-16 19:20:49
【问题描述】:
    int meta_size = 24;
    node_t* prev;

    printf("%lx, ", prev + meta_size );
    printf("%lx, ", prev); 
    printf("%lx, ", meta_size);

输出:1519240、1519000、18 这是怎么回事?

【问题讨论】:

  • 你期待什么?您使用了错误的格式说明符来打印指针,该指针调用未定义的 baheviour。尽管有你的标题,但你没有添加 unsigned longint
  • 你了解hexadecimal 数字吗?

标签: c hex unsigned-integer


【解决方案1】:

Prev 是一个未初始化的指针,它包含(一个随机的,因为它没有初始化)内存地址。

printf("%lx, ", prev + meta_size );//Prints the memory address prev is pointing to + (sizeof(node_t) * meta_size)
printf("%lx, ", prev);             //Prints the memory address prev is pointing to
printf("%lx, ", meta_size);        //Prints meta_size, 18 is 24 in hexidecimal, because of the 'x' in %lx 

但是,前 2 行是未定义的行为,因为指针应该用 %p 打印

【讨论】:

  • prev 已初始化。我只是没有显示它。
【解决方案2】:

如果你这样做 sizeof(node_t) 我很确定你会获得 10 个。

【讨论】:

  • 实际上是24十进制或0x18十六进制。请注意,所有输出数字都是十六进制的。
  • 是的,你是对的。当您将 n 添加到 node_t 指针时,指针地址将增加 n * (sizeof(node_t)) 这就是为什么它在基数 16 中增加 240 = 在基数 10 中增加 576 = 在基数 10 中增加 24 * 24。
猜你喜欢
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 2012-01-27
  • 2016-07-29
  • 2011-08-25
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多