C – 第一个参数在可变数量的参数中的作用
在此代码中,第一个参数值为1,表示传递的参数总数.
在被调用的函数中,我能够访问所有参数. 那么第一个参数的用途是什么? 是不是应该限制我访问多个参数. int main(){ fun1(1,"Apple","Boys","Cats","Dogs"); return 0; } void fun1(int num,...){ char *str; va_list ptr; va_start(ptr,num); str = va_arg(ptr,char *); str = va_arg(ptr,char *); printf("%s ",str); } 输出:男孩 解决方法
对这个问题的答案有两种观点.
1.运行时的观点 va_start()和va_arg()必须知道在哪里找到参数.通常,编译器将计算所有参数的固定内存位置.在使用可变参数函数的编译时,这是不可能的. stdarg函数由运行时提供,并且知道如何在堆栈上找到参数,但它们需要一些引用.因此,您始终必须在编译期间知道一个位置:最后一个非可变参数的位置.然后,va_start()和va_args()可以计算下一个参数的位置. 这很可能是由于John Bollinger在标准中要求至少一个非变量参数的实际原因,感谢这句话. 2.程序员的观点 如果您尝试读取的参数多于传递的参数,则会导致未定义的行为,因为您从没有找到参数的内存位置读取.所以你需要知道何时停止.实现此目的的一种简单方法是只传递以下参数的数量,就像在您的代码段中一样.一个众所周知的可变参数函数是printf(),它通过解析格式字符串知道参数的数量. 因此,要解决您的编辑问题:没有自动限制,由您自己如何让您的函数知道要读取多少个参数,并且您有责任只读取有效参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |