【问题标题】:Is memsetting a element in an array correct?memsetting 数组中的元素是否正确?
【发布时间】:2014-09-09 18:25:49
【问题描述】:

是在数组中设置一个指针,还是我只是在此处覆盖指向元素的指针? 当我 memset 整个内存区域或数组中的元素时会更好吗?

例如:

....
struct pollfd fds[2];
int tmp = 0;

for(; tmp < sizeof(fds[0])/sizeof(fds); tmp ++) {
    memset(fds[tmp], 0x00, sizeof(fds[tmp]));
}
....

对比

....
struct pollfd fds[2];

memset(fds, 0x00, sizeof(fds[tmp]));
....

【问题讨论】:

  • "...覆盖指向元素的指针..." -- 指向元素的指针是什么?数组对象只包含一系列元素;除非您创建它们,否则没有指向元素的指针。 memset 对单个元素或整个数组是否有意义取决于 struct pollfd 的内容。
  • 第二个例子 memset 只有一个元素。要 memset 数组中的所有元素,请使用:memset(fds, 0x00, sizeof(fds));
  • @deffel:你在说什么“指针”?到目前为止,我在您发布的代码中没有看到一个指针。
  • @deffel:您的第一个代码示例无效(不可编译),这有点破坏了整个问题。让我们从这个开始:你想做什么?当我们不知道您真正想要做什么时,我们应该如何知道什么是“更好的”?
  • 另外,你想用sizeof(fds[0])/sizeof(fds)做什么?你认为这个表达式的结果是什么?

标签: c pointers static


【解决方案1】:

不确定您是否已经测试过您的代码。但memset 的论点不正确。

第一种方法:

使用

memset(&fds[tmp], 0x00, sizeof(fds[tmp]));
   //  ^ Missing &

而不是

memset(fds[tmp], 0x00, sizeof(fds[tmp]));

第二种方法:

使用

memset(fds, 0x00, sizeof(fds));
                  //     ^^^ use size of the whole array.

而不是

memset(fds, 0x00, sizeof(fds[tmp]));

【讨论】:

    【解决方案2】:

    如果你愿意,当然可以memset 一个数组元素。

    不过,一次调用 memsetting 所有连续元素的效率更高(标准保证数组元素之间没有填充)。

    您当前代码中的错误:

    • 您的第一个示例缺少操作员地址,请使用:

      memset(&fds[tmp], 0, sizeof *fds);
      

      或者:

      memset(fds+tmp, 0, sizeof *fds);
      
    • 您的第二个示例传递单个元素的大小而不是整个数组,请使用:

      memset(fds, 0, sizeof fds);
      

    一些附带问题:

    • sizeof 是一个运算符,不需要括号,除非你传递一个类型
    • 对于所有类型,All-bits-zero 不一定与 0 相同,尽管它适用于现代系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多