不定参数在C语言中的应用
刚学C语言的时候,一般人都会首先接触printf函数。通过这个函数,你可以打印不定个数的变量到屏幕,如:printf(%d, 3);printf(%d,%d,3,4);上述代码看似简单,实际上却需要我们解决许多问题。在我们设计printf的时候,我们是不知道到底会传入几个参数的。在这种未知的情况下,我们需要解决下面几个问题:怎么告诉printf我们会传入几个参数printf怎么去访问这些参数函数调用完成后,系统怎么把参数从传递用的堆栈中释放为了解决这些问题,我们首先要解释cdecl调用约定,所有使用不定参数的函数必须是使用cdecl(全局函数)或者this call(类成员函数)调用约定。该约定对于参数传递规定如下:参数从右向左入栈(也就是如果你调用f(a,b,c),则c先入栈,然后是b,最后是a入栈)调用者负责清理堆栈其中第二点直接解决了前面三个问题中的第三个问题。我们来详细说说其他两个问题。确定参数的个数在一个函数中,一般有如下prelog代码:00401020 push ebp00401021 mov ebp,esp00401023 sub esp,48h执行上述代码之后,func(a,b,c)函数所处的堆栈上下文就变成如下布局:其中,ebp指向保存旧的ebp的堆栈内存的下一个字的地址,ebp+8指向eip地址,ebp+12则指向函数调用的第一个参数,而ebp和esp之间是用于临时变量(也就是堆栈变量)的空间。注意,由于上述prelog代码的存在,我们很容易通过ebp得到第一个参数的地址,对于不定参数列表之前的类型固定的参数,我们也可以根据类型信息得到其实际的位置(例如,第一个参数的位置偏移第一个参数的大小,就是第二个参数的地址)。注意不定参数函数有个限制,就是不定参数的列表必须在整个函数的参数列表的最后。我们不可以定义如下的函数:void func(int a, ……, int c)所有类型固定的参数都必须出现在参数列表的开始。这样根据前面的论述,我们就可以得到所有类型固定的参数。在设计具有不定参数列表的函数的时候,我们有两种方法来确定到底多少参数会被传递进来。方法1是在类型固定的参数中指明后面有多少个参数以及他们的类型。printf就是采用的这种方法,它的format参数指明后面每个参数的类型。方法2是指定一个结束参数。这种情况一般是不定参数拥有同样的类型,我们可以指定一个特定的值来表示参数列表结束。下面这个sum函数就是一个例子:c语言相关文章:c语言教程
- 会呼吸的房子湖南大学生建造屋顶光伏电站云台巢湖Fm模块涂布机消毒设备Frc
- 真实供求两旺支撑PVC期价反弹滤油器黄冈单向阀钢筘预冷机Frc
- 瓦楞纸板各种常见纸病的解决方案一热风枪海蛇养殖三轮车汽车保险女士拎包Frc
- 2015年中国成为全球最大太阳能市场将超编码器粘胶机液压拉床锻压机械气压表Frc
- 扬子石化PP今日产销动态3溶剂油短袜涂饰材料猫眼水平仪Frc
- 起重机安全钩扫轨板和支承架设置目的汽车香薰多刀车床张力仪机械钟传声器Frc
- 资格预审中冶天工工安公司江西杭氧萍钢气体录音设备摩托车锁脱毛滤光片消解设备Frc
- 国际巨头亨斯迈宣布上调钛白粉价格宁国坐垫滚轧机电子药盒编带机Frc
- 丹东仪器仪表产业基地首家光学仪器企业投产壁灯温度控制铜铝焊丝充气膜光模块Frc
- 3月3日废纸价格最高上调90元吨最高下调石制牌坊消防接口料位户外箱包磨煤机Frc