【建站服务】铜仁做网站/制作网站/搭建网站/设计网站/开发网站-网站服务一站式-域名申请
作者: 风兰 . 阅读量: 5 . 发表时间:2022-09-21 03:02:50
上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
铜仁做网站/制作网站/搭建网站/设计网站/开发网站-网站服务一站式

用二楼的非固定参数方法时遇到bug,我传递的参数是结构体指针,代码如下:
void AddChildren(Node* parent, ...)
{
if (parent == NULL) return;
Node* child = NULL;
va_list child_list;
va_start(child_list, parent);
while (child = va_arg(child_list, Node*)) {
parent->children[parent->child_ptr++] = child;
}
va_end(child_list);
child = NULL;
}
但是在打印树结构时,报错
Segmentation fault (core dumped)
我当时并不清楚错误产生的原因,而当我修改该函数为:
void AddChildren(Node* parent, int childnum, ...)
{
if (parent == NULL) return;
va_list child_list;
va_start(child_list, childnum);
for (int i = 0; i < childnum; i++) {
parent->children[parent->child_ptr++] = va_arg(child_list, Node*);
}
va_end(child_list);
}
之后代码可以正确运行。
后来我从Stackoverflow上找到了相关的解答:https://stackoverflow.com/questions/9774803/stdarg-h-reads-too-many-arguments
部分内容摘录如下:
Don't use va_list, especially in member functions. And you need to know the number of the arguments, va_arg will happily read the entire memory if it can。
所以一种解决方案是像我上面那样传入确定的参数个数。
而另一位老哥给出了另一种解决方案,即仍旧使用二楼类似的代码,但在传递参数时额外传递一个0,作为while判断的终止符号:
Variadic function arguments are not typesafe, or any kind of 'safe' for that matter. It is your responsibility to communicate to your function how many arguments there are and what their types are.
In your code, the only thing that makes the loop terminate is when x evaluates as false. Your data, obscurely typed as it is, seems to consist of integral values, and that would necessitate your last variadic argument to be zero, which it isn't in your example.
Try calling the function wtih (n, x1, x2, x3, 0).
铜仁做网站/制作网站/搭建网站/设计网站/开发网站-网站服务一站式
上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。
服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)
关键词:网站建设,企业网站,网站制作,网页设计,高端网站建设,企业网站制作,网页制作,制作网站,网站设计,高端网页设计,高端网站设计,做网站,自适应网站



参使用实例 test.c:
#include <stdio.h>#include <string.h>#include <stdarg.h>void tLog(char *sInfo, ...);int main(int argc, char *argv[]){ char str[4+1] = {0}; strcpy(str,"INFO"); tLog(str,argv[1],argv[2],argv[3]); return 0;}void tLog(char *sInfo, ...){ char *str = NULL; char *str1 = NULL; char *str2 = NULL; va_list sArgv; // 申请参数列表变量 va_start(sArgv, sInfo); // 申明最后一个传递给函数的已知的固定参数 /* 依次读取固定参数 sInfo 后的 参数 */ str = va_arg(sArgv, char*); str1 = va_arg(sArgv, char*); str2 = va_arg(sArgv, char*); va_end(sArgv); printf("运行输出:[%s,%s%s%s] ",sInfo,str,str1,str2);}编译 gcc test.c 得到 a.out。
运行程序:
飞奔的蚂蚁2018
138***86735@163.com
liaoyungchun
lia***ngchun@qq.com
楼上的依然固定了参数,更正:
#include <stdio.h>#include <string.h>#include <stdarg.h>void tLog(char *sInfo, ...){ char *str = NULL; va_list sArgv; // 申请参数列表变量 va_start(sArgv, sInfo); // 申明最后一个传递给函数的已知的固定参数 puts(sInfo); /* 依次读取固定参数 sInfo 后的 参数 */ while(str = va_arg(sArgv,char*)) { puts(str); } va_end(sArgv);}void tstdarg(){ char str[4+1] = {0}; strcpy(str,"INFO"); tLog(str,"argv1","argv2","argv3","argv4");}liaoyungchun
lia***ngchun@qq.com
一点星光
ist***hang@outlook.com
参考地址
二楼的方法并不安全!!
在使用二楼的非固定参数方法时遇到bug,我传递的参数是结构体指针,代码如下:
void AddChildren(Node* parent, ...){