我正在使用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才能理解?
关心 新手
答案 0 :(得分:7)
去看看变量声明。我的猜测是某人是short
或long
,而不是int
。由于printf无法检查您传递的有效性,因此它会根据%符号决定从堆栈中抓取多少个咬合。如果您的args不同意格式,而不是编译错误,但垃圾可能会出现。
答案 1 :(得分:3)
我猜你在传球的类型与你传递的传球类型之间存在不匹配。具体来说,它看起来像cp-> set_mask是某种比int大的类型。既然你已经告诉printf它是一个int,它将第一个sizeof(int)字节作为第一个int,然后是下一个sizeof(int)字节,好像它是nsets(并且因为你显然是一个小的 - endian机器,那些字节都包含0)。特别要注意的是,在 0后出现的第一个打印出的128是nsets
的值。