2011-04-25 113 views
1

我正在使用Simple Scalar工具集在缓存关联性上运行一些模拟。而且我正在用printf函数看到一些最奇怪的行为。这里是代码片段:命令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

这四个参数的类型是什么? – 2011-04-25 05:12:27

回答

7

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

+1

现在在大多数系统中'sizeof(int)== sizeof(long)',因为OP说''set_mask'是'long long'。 – 2011-04-25 05:41:24

3

我想你会在你传递的类型和你正在告诉打印的类型之间出现错误匹配。具体来说,它看起来像cp-> set_mask是比int大一些的类型。既然你已经告诉printf它是一个int,它将第一个sizeof(int)字节作为第一个int,然后将下一个sizeof(int)字节看作nsets(因为你明显处于一个小小的状态) endian机器,那些字节都包含0)。注意,特别是之后的的0来的第一个打印的128是nsets的值。

+0

哦,你们很棒。我会永远不会发现! set_mask实际上是long long int。我只是将%d更改为%lld,并修复了这一问题。谢谢!!! – Richeek 2011-04-25 05:25:30