命令printf的一个奇怪的问题

时间:2011-04-25 05:11:01

标签: c++ c

我正在使用Simple Scalar工具集来对缓存关联性运行一些模拟。我看到printf函数有一些奇怪的行为。以下是代码段:

printf(" Name: %s %d %d %d \n", name, nsets, cp->set_shift, cp->set_mask);
printf(" Name: %s %d %d %d \n", name, cp->set_mask, nsets, cp->set_shift);

printf行是一个接一个,其中没有其他代码。这是输出:

 Name: dl1 128 5 127
 Name: dl1 127 0 128

第二个printf的输出错误。第二个printf的输出应为:

Name: dl1 127 128 5

更改printf语句的相对顺序不会更改输出。我缺少什么部分的printf才能理解?

关心 新手

2 个答案:

答案 0 :(得分:7)

去看看变量声明。我的猜测是某人是shortlong,而不是int。由于printf无法检查您传递的有效性,因此它会根据%符号决定从堆栈中抓取多少个咬合。如果您的args不同意格式,而不是编译错误,但垃圾可能会出现。

答案 1 :(得分:3)

我猜你在传球的类型与你传递的传球类型之间存在不匹配。具体来说,它看起来像cp-> set_mask是某种比int大的类型。既然你已经告诉printf它是一个int,它将第一个sizeof(int)字节作为第一个int,然后是下一个sizeof(int)字节,好像它是nsets(并且因为你显然是一个小的 - endian机器,那些字节都包含0)。特别要注意的是, 0后出现的第一个打印出的128是nsets的值。