C语言中变量类型改变导致输出结果错误

如题所述

第1个回答  2019-04-05
printf是一个变参函数,由于printf本身不知道调用时传递给自己的参数个数是多少,以及每个参数的类型分别是什么,需要调用者传递一个格式字符串告诉它,printf从格式字符串中解析占位符得出传递的参数个数以及每个参数的类型,接下来才能正确处理这些参数。如果格式字符串中给出的占位符信息错误,那么就会导致printf对参数的处理错误,输出结果自然也就很有可能不正确。
printf("%ld%f", m, n); 执行这条语句时,printf首先从格式字符串"%ld%f"中得知调用者除了格式字符串还传递了两个参数,第一个是long型,第二个是double型。在Windows中long占4字节而double占8字节,并且printf的调用约定是__cdecl,参数是从右至左入栈的,格式字符串在栈顶。于是printf从栈顶向下4字节的位置取4个字节就能取到第一个long型参数,再向下取8个字节就能取到第二个double型参数,接下来就能正确输出这两个参数到屏幕上了。
而如果调用者误写成了printf("%f%f", m, n);,那么printf会认为调用者传递给了自己两个double型参数,于是它会从栈顶向下4字节和12字节的位置分别取两个8字节的数据当做两个double型并输出它们,然而此时实际的两个参数m和n分别位于栈顶下4~7字节和8~15字节处,于是m的全部4字节和n的前4个字节被一起当作了第一个double型,而n的后4字节和n下方的4字节被当成了第二个double型,最终两个数的输出结果自然都不正确。
相似回答