[英]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.