【发布时间】: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