【问题标题】: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

标签: c memset variadic-functions


【解决方案1】:

这意味着编写此代码的程序员不知道自己在做什么,并且喜欢浪费代码。

他们可能会盲目地遵循某些静态分析工具的指令,即变量必须在使用之前进行初始化。

va_start(args, xxx); 进行所有必要的初始化,并覆盖 memset 刚刚输入的所有 0 值,使 memset 的工作毫无价值。

【讨论】:

    【解决方案2】:

    memset 按字节设置内存。它不关心参数的类型是什么,实际上它需要一个void 指针。

    它将在dest之后将count的内存位置数量设置为字符ch

    void* memset( void* dest, int ch, size_t count )
    

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2014-10-13
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多