Printk函数简单解析

本文详细解析了C语言中的可变参数函数printk,包括其函数原型、参数传递方式、可变参数操作宏va_list、va_start、va_arg的使用,以及vsprintf函数在解析可变参数中的作用。通过示例代码和图示说明了printk函数内部的工作流程,特别是参数在栈中的分布和宏如何帮助获取和处理可变参数。
摘要由CSDN通过智能技术生成
  1. C语言函数可变参数的原理

  2. 可变参数函数原型

    Printk函数原型如程序清单 1.1所示:

    程序清单 1.1

    int printk(const char *fmt, ...);

    从printk函数原型可知,printk除了接收一个固定参数fmt外,后面的参数用...表示。在C/C++语言中,...表示可以接收可变数量的参数(0或0个以上参数)。

  3. 函数参数传递方式

    Printk的参数通过栈来传递,在C/C++中,函数默认调用方式是_cdecl,表示由调用者管理参数入栈操作,且入栈顺序为从右至左,入栈方向为从高地址到低地址。因此,从第n个到第1个参数被放在地址递减的栈中。

    假设现在有一段代码如程序清单 1.2所示:

    程序清单 1.2

    int a = 0x12345678;

    char b = 2;

    char *c = "hello";

    printk("print %d, %d, %s\n", a, b, c);

    调用printk时参数在栈中的分布如图 1.1所示:

    1.1 Printk参数在栈中的分布

    这里假设"print %d, %d, %s\n"字符串的首地址是0x20000000,"hello"字符串的首地址是0x10000000。从图 1.1中还能看出一个有意思的地方,那就是参数b虽然是1个字节,但是压栈时被扩展为4字节数据,高位补0。也就是说每次压栈的数据最少为4字节,不足4字节的数据补0。

  4. 可变参数操作宏

    假设有一段代码如程序清单 1.3所示:

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值