我一直在使用一些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
更容易出错,因为它很容易混淆参数的顺序。