C语言——printf()函数参数传递问题

C语言——printf( ) 函数参数传递问题

一、参数说明

printf() 函数是输出函数,可以实现和用户之间的交流,该函数的参数由两部分组成,即格式化字符串、待打印项 0-n 项,函数的格式如下:

printf(格式化字符串, 待打印项1, 待打印项2, ...);
二、工作原理
  1. printf() 函数的调用是告诉计算机把变量的值传递给程序,首先,程序把传入的值按照变量类型放入“栈”内存区;
  2. 然后控制权交给 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;
}
  1. printf() 函数的调用是告诉计算机把变量 n1、n2、n3、n4 的值传递给程序,程序把传入的值按照变量类型放入“栈”内存区。

    按照变量的前后顺序依次在栈中创建内存区域,例子中的 n1 变量类型为 float(8字节),n2 变量类型为 double(8字节),n3 变量类型为 long(4字节),n4 变量类型为 long(4字节),在栈中的内存如下所示:

  2. 变量存好后,控制交给 printf() 函数,该函数根据转换说明从栈中读取数据,%ld 表明函数应该读取 4 字节,所以 printf() 读取栈中的前 4 个字节作为第 1 个值,但是这个值是 n1 实际值的一部分,显示出来的数据是错误的。

在这里插入图片描述

  1. 同理,因为转换说明中对于 4 个变量的转换说明都为 %ld,因此需要依次需要读取 4 个字节,这就导致了数据的错位,因此得到的结果也是错的,运行结果如下:
0 1074266112 0 1074266112
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值