现在的位置: 首页 > 综合 > 正文

printf问题,网上找的

2013年10月14日 ⁄ 综合 ⁄ 共 573字 ⁄ 字号 评论关闭
printf问题,网上找的

看看这个:

int main()
{
  long int i = 65536l;

  printf("%d, %ld", i, i);
  return 0;
}

在 TC 下的输出会是什么?我一开始以为是0, 65536,错!结果是0, 1!

分析一下:65536D = 00 01 00 00B,在内存中倒序存放成为00 00 01 00,然后入栈两
次,参数占就成了00 00 01 00 00 00 01 00。然后printf开始解析参数,看到第一个%d
,解析为int,只取参数前两个字节(16位)00 00,就成了0;看到第二个%ld,解析成l
ong,取接着的4个字节(32位)01 00 00 00,也就是说是1(别忘了倒过来,怪就怪int
el的破CPU吧,呵呵)!为了验证,可以写一个这样的程序:

int main()
{
  long int i = 0x12345678;

  printf("%x, %lx", i, i);
  return 0;
}

输出:5678, 56781234。

再次分析:参数在栈中的状态是78 56 34 12 78 56 34 12,printf解析第一个参数取到
78 56,也即5678;解析第二个参数取到34 12 78 56,即56781234。看来还不错,应该
就是这个原因了。

总结:看来以后使用不定参函数还要格外小心,万一参数类型不匹配,尤其是长度不匹
配的情况,可能导致的直接后果就是后面的参数全都乱套! 

抱歉!评论已关闭.