C语言可变长参数列表原理与实现

来源:互联网 发布:mysql触发器 编辑:程序博客网 时间:2024/06/05 14:56

可变参数在编程中的实现。
stdarg.h标准库提供的宏支持了可变长参数列表的使用。
当然,在一些情况下也可以自己通过其实现原理来使用可变长参数编程。
条件一:
C语言编程中函数的形参入栈顺序都是从右至左。栈的生长方向是,低地址《—— 高地址,而且栈由系统分配,不存在碎片化内存。
结论:只要知道一个参数的地址,就可以顺势推出其他参数的地址。

在使用可变长参数的情形下,都会想方设法的标注参数的类型和个数,因为我们无从得知!
最经典的用法:extern int printf(const char *format,…);函数,再给出的一个个%d和%f等等条件中,统计%即可知道携带了几个参数,与%之配对的字符代表了对应位置的
参数类型。
假设:printf(“a:%d , b:%f!”, 10, 20.0f);
编程思路:
遇到了第一个%代表该取参了:
char *p = &format+1;//指向第一个参数10的低地址
并且第一个%匹配的参数是类型“d”,那就通过 int a = (int )p;来取数,顺便 p += sizeof(int);使其指向下一段内存的低地址。

//试验源码#include<stdlib.h>#include<stdio.h>int print(int nnum,...);int main(){    print(1, 2, 3.0f, 4, 5);    system("pause");}int print(int nnum, ...){    char *p =(char *)(&nnum + 1);       printf("%d", *(int *)p);    p += sizeof(int);    printf("%f", *(double *)p);//很多编译器总是以double长度来存储float,取用的时候进行截断。    p += sizeof(double);    printf("%d", *(int *)p);    p += sizeof(int);    printf("%d", *(int *)p);    p += sizeof(int);    return 0;}
0 0
原创粉丝点击