C语言——printf( ) 函数参数传递问题
一、参数说明
printf() 函数是输出函数,可以实现和用户之间的交流,该函数的参数由两部分组成,即格式化字符串、待打印项 0-n 项,函数的格式如下:
printf(格式化字符串, 待打印项1, 待打印项2, ...);
二、工作原理
- printf() 函数的调用是告诉计算机把变量的值传递给程序,首先,程序把传入的值按照变量类型放入“栈”内存区;
- 然后控制权交给 printf() 函数,该函数根据转换说明从栈中读取数据。
三、举例说明
参数的传递过程以下面的代码为例进行分析:
#include <stdio.h>
int main(void)
{
float n1 = 3.0;
double n2 = 3.0;
long n3 = 2000000000;
long n4 = 1234567890;
printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);
return 0;
}
-
printf() 函数的调用是告诉计算机把变量 n1、n2、n3、n4 的值传递给程序,程序把传入的值按照变量类型放入“栈”内存区。
按照变量的前后顺序依次在栈中创建内存区域,例子中的 n1 变量类型为 float(8字节),n2 变量类型为 double(8字节),n3 变量类型为 long(4字节),n4 变量类型为 long(4字节),在栈中的内存如下所示:
-
变量存好后,控制交给 printf() 函数,该函数根据转换说明从栈中读取数据,%ld 表明函数应该读取 4 字节,所以 printf() 读取栈中的前 4 个字节作为第 1 个值,但是这个值是 n1 实际值的一部分,显示出来的数据是错误的。
- 同理,因为转换说明中对于 4 个变量的转换说明都为 %ld,因此需要依次需要读取 4 个字节,这就导致了数据的错位,因此得到的结果也是错的,运行结果如下:
0 1074266112 0 1074266112