memset和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版本相比:

  • 如果你减少了myArray的大小而不记得对memset做相应的改变,memset会写超出数组的边界,这是未定义的行为。
  • 如果你增加了myArray的大小而没有记住对memset进行相应的更改,那么末尾的元素将是未初始化的垃圾。

(使用memset的更好方法是使用memset(myArray, 0, sizeof myArray))

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

最新更新