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

    xiaoxiao2021-03-25  121

    可变参数在编程中的实现。 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; }
    转载请注明原文地址: https://ju.6miu.com/read-5194.html

    最新回复(0)