zoukankan      html  css  js  c++  java
  • C 可变参数

    #include <stdio.h>
    #include <stdarg.h>
    
    extern char* baseconv(unsigned int,int); //格式化数字
    
    void miniprintf(const char *fmt,...)
    {
        const char* p;
        int i;
        unsigned u;
        char* s;
        va_list argp;
        va_start(argp,fmt);
    
        for(p=fmt;*p!='';p++)
        {
            if(*p!='%')
            {
                putchar(*p);
                continue;
            }
            
            switch(*++p)
            {
                case 'c':
                    i=va_arg(argp,int);//“默认参数提升”规则,在可变参数部分
                    putchar(i);
                    break;
                case 'd':
                    i=va_arg(argp,int);
                    if(i<0)
                    {
                        i=-i;
                        putchar('-');
                    }
                    fputs(baseconv(i,10),stdout);
                    break;
                case 'o':
                    u=va_arg(argp,unsigned int);
                    fputs(baseconv(u,8),stdout);
                    break;
                case 's':
                    s=va_arg(argp,char*);
                    fputs(s,stdout);
                    break;
                case 'u':
                    u=va_arg(argp,unsigned int);
                    fputs(baseconv(u,10),stdout);
                    break;
                case 'x':
                    u=va_arg(argp,unsigned int);
                    fputs(baseconv(u,16),stdout);
                    break;
                case '%':
                    putchar('%');
                    break;
            }
        }
        va_end(argp);
    }

    关于可变参数的部分,仔细想想的话:应该是把所有的参数放到了一个块内存中,然后将数据一个个取出来。但是取出来的时候要定义类型,每个类型确定了取出来的内存的大小。

    ps:定义函数时第一个参数不能缺少吧,然参数的开始地址怎么找,至少要给个名字(地址)

    ##15-8-2

    对于函数在栈中

    在这幅图中,可以看到的:
    1.对于函数来说,形参在函数栈的最底端,而且是从后往前开始进栈的;
    2.在形参之后,马上就是函数的返回值数据;
    3.再才是函数自己的局部变量数据

    也就是说在C语言的可变参数这块中,不可或缺的就是第一个参数的确定,第一个参数确定了后面读取多少个参数

    ##15-8-2

    va_arg(argp,var_Type);
  • 相关阅读:
    MS Office CVE-2015-1641 恶意 Exploit 样本分析
    Qbot回归,已感染5.4万台计算机
    工具推荐:Backdoor-apk,安卓APK文件后门测试工具
    安卓微信、QQ自带浏览器 UXSS 漏洞
    延迟注入工具(python)
    小白欢乐多——记ssctf的几道题目
    使用转义防御XSS
    富文本存储型XSS的模糊测试之道
    k8s故障总结
    CentOS7.6部署k8s环境
  • 原文地址:https://www.cnblogs.com/yoru/p/4149722.html
Copyright © 2011-2022 走看看