【问题标题】:Should a struct be typecasted before memset是否应该在 memset 之前对结构进行类型转换
【发布时间】:2016-07-25 21:28:28
【问题描述】:

为什么要在 memset 函数中对结构进行类型转换。我看到很多类似下面的代码:

memset( (char*) &mFdr, 0, sizeof(FdrData) );

FdrData 是一个结构体,而 memset 接受一个 void 指针。据我了解,我认为 void 指针应该采用任何类型的指针,并将每个字节都视为您想要的任何内容。我知道 0 被转换为无符号字符。但是我不明白 memset() 的类型转换结构的意义。

【问题讨论】:

  • 这很荒谬,特别是考虑到这主要发生在声明变量之后,您可以更轻松地编写FdrData mFdr {0};,它可以实现相同的目标并且具有额外的好处,它不会意外破坏非POD 结构(因为它不会编译)。
  • @H.Guijt 如果有一个参数构造函数,它会编译,参数可从int转换。
  • 在这种情况下,它至少仍会正确构造,而不会在对象的内存中爆破零,无论应该存在什么。
  • 自 C99 以来没有任何意义,在此之前,如果您也没有 memset 范围内的原型,则省略强制转换将是未定义的行为。所以你会在非常旧的代码中看到它(或者由没有保持新鲜的老前辈编写的新代码)
  • @M.M 从技术上讲,在演员解析为const_cast 的情况下仍然有必要。不过,想不到一个这样(理智的)场景。

标签: c++ pointers struct memset


【解决方案1】:

你不应该做你的例子。正如你所说,(char*) 没有任何用途。

memset(来自使用 c++ 的 c 程序员)的许多历史用途都不需要(从未需要)。例如,您可以使用 {}... 初始化一个结构体。

struct Thing {
    int x, y, z;
};

Thing t{}; // x = 0, y = 0, x = 0;
Thing t2; // x, y, and z could be anything

我想不起来我上次在结构上使用 memset 是什么时候了。

【讨论】:

  • C++ 的任何迭代都不需要演员表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2022-01-19
  • 2014-11-28
  • 2019-11-20
  • 2012-11-14
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多