2015-09-30 53 views

回答

4

也就是说未定义行为。

简短的回答是不这样做,并使编译器警告在编译时-Wformat-Wall检测到它。

龙答:

函数声明为:

int printf(const char *format, ...); 

这意味着它知道第一个参数是一个格式,之后可能会有更多一些。它会扫描format字符串,并且对于每个说明符(例如%d),它会尝试从与该类型对应的堆栈中删除数据(在本例中为int)。

当调用你的函数,你这样做:

push sum 
push const_format_string_pointer 
call printf 

在printf中,它会先读取const_format_string_pointer,然后相加,那么无论是和之前的堆栈。这通常是调用函数的局部变量(在此例中为x,ysum)。事实上,它确实打印出11和6,对应于sumy。另一个%d可能会打印出5个。

三个大数字是编译器为了自己的需要而添加到堆栈中的东西。它们在调试模式下有意义,但它是编译器特定的。此外,如果您通过优化编译代码(例如-O2),它可能会删除部分或全部较大的数字,并且您最终会在堆栈中打印比调用方的本地函数更深的内容,例如调用者的推送ebp ,或来电者的回信地址等。

相关问题