加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C – 第一个参数在可变数量的参数中的作用

发布时间:2020-12-16 10:53:51 所属栏目:百科 来源:网络整理
导读:在此代码中,第一个参数值为1,表示传递的参数总数. 在被调用的函数中,我能够访问所有参数. 那么第一个参数的用途是什么? 是不是应该限制我访问多个参数. int main(){ fun1(1,"Apple","Boys","Cats","Dogs"); return 0;}void fun1(int num,...){ char *str; v
在此代码中,第一个参数值为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(),它通过解析格式字符串知道参数的数量.

因此,要解决您的编辑问题:没有自动限制,由您自己如何让您的函数知道要读取多少个参数,并且您有责任只读取有效参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读