memset() 对 va_list 的含义是啥?
Posted
技术标签:
【中文标题】memset() 对 va_list 的含义是啥?【英文标题】:What is the implication of memset() for va_list?memset() 对 va_list 的含义是什么? 【发布时间】:2017-01-11 09:25:47 【问题描述】:我阅读了以下代码片段:
va_list args;
memset(&args, 0, sizeof(va_list));
va_start(args, xxx);
...
va_end(args);
memset()
在va_start()
之前的含义是什么?
如果去掉memset()
行有什么区别?
【问题讨论】:
它用零填充args
变量。
你在哪里找到这个代码?我认为这是没用的,因为va_start
之后写args
。
有趣。 va_start(args, xxx);
不会看起来像初始化 args
一样多于 foo(args)
不会影响 main()
的 args
。然而va_start
是一个宏并且确实会影响args
。
【参考方案1】:
这意味着编写此代码的程序员不知道自己在做什么,并且喜欢浪费代码。
他们可能会盲目地遵循某些静态分析工具的指令,即变量必须在使用之前进行初始化。
va_start(args, xxx);
进行所有必要的初始化,并覆盖 memset
刚刚输入的所有 0 值,使 memset
的工作毫无价值。
【讨论】:
【参考方案2】:memset
按字节设置内存。它不关心参数的类型是什么,实际上它需要一个void
指针。
它将在dest
之后将count
的内存位置数量设置为字符ch
void* memset( void* dest, int ch, size_t count )
【讨论】:
以上是关于memset() 对 va_list 的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章
前面声明过va_list ap;后面出现了va_start (ap, fmt),va_arg (ap, int)。fmt 和 int 是啥参数啊?
va_list arg_list va_start(arg_list, format) va_end( arg_list ) 原理的理解