繁体   English   中英

memset 和初始化(数组)的区别?

[英]Difference between memset and initialization (array)?

我一直在使用一些 C 代码,我想知道下一个代码之间有什么区别:

double myArray[5] = {0,0,0,0,0};

double myArray[5];
memset(myArray,0,5*sizeof(double));

用第一个替换第二个会不会有问题? 如果是这样,可能会出现什么样的问题?

以这种方式使用memset对浮点数的表示进行了假设,特别是所有位 0 的表示对应于值 0。

如果您的系统使用 IEEE754 浮点表示(与您可能遇到的大多数系统一样),则此假设成立。 但是,如果您发现自己在一些没有的外来系统上运行您的代码,那么您可能不会得到您期望的结果。

除了dbush 的回答之外,尽管在使用memset大多数现代系统上可能不会出现问题,但memset版本(如所写)更脆弱。 如果有一天您决定更改myArray的大小,那么使用支撑初始化列表的版本会发生以下两种情况之一:

  • 如果您减小myArray的大小,您将收到关于初始值设定项过多的编译错误。
  • 如果增加myArray的大小,则任何没有显式初始化程序的元素都将自动初始化为 0。

相比之下,使用memset版本:

  • 如果您在不记得对memset进行相应更改的情况下减小了myArray的大小,则memset将写入超出数组的边界,这是未定义的行为。
  • 如果在不记得对memset进行相应更改的情况下增加了myArray的大小,则最后的元素将是未初始化的垃圾。

(使用memset更好方法是执行memset(myArray, 0, sizeof myArray) 。)

最后,IMO 首先使用memset更容易出错,因为很容易混淆参数的顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM