san*_*and 9 c c++ arrays array-initialization
我最近遇到一个案例,我需要比较两个文件(黄金和预期)来验证测试结果,即使写入两个文件的数据相同,文件也不匹配.
在进一步调查中,我发现有一个结构包含一些整数和一个64字节的char数组,并且在大多数情况下并没有使用char数组的所有字节,并且数组中未使用的字段包含随机数据造成了不匹配.
这让我想问一个问题是,在C/C++中初始化数组是否也是一个好习惯,就像在Java中完成一样?
Jas*_*ams 23
在使用它们之前初始化内存/变量是一个好习惯 - 未初始化的变量是通常很难追踪的错误的重要来源.
在将其写入文件格式时初始化所有数据是一个非常好的主意:它使文件内容更清晰,因此更容易使用,如果有人错误地尝试"使用"未初始化的数据,则不太容易出现问题(请记住它可能不仅仅是你自己的代码,将来读取数据),并使文件更具可压缩性.
在使用变量之前不进行初始化的唯一理由是在性能关键的情况下,初始化在技术上是"不必要的"并且会产生很大的开销.但在大多数情况下,初始化变量不会造成重大损害(特别是如果它们仅在使用之前立即声明),但通过消除常见的错误来源可以节省大量的开发时间.
在数组中使用未定义的值会导致未定义的行为.因此,该程序可以自由地产生不同的结果.这可能意味着您的文件最终略有不同,或程序崩溃,或程序格式化您的硬盘驱动器,或程序导致恶魔飞出用户鼻子(http://catb.org/jargon/html/N/ nasal-demons.html)
这并不意味着您需要在创建阵列时定义数组值,但必须确保在使用之前初始化任何数组值.当然,确保这一点的最简单方法是在创建数组时执行此操作.
MyStruct array[10];
printf( "%f", array[2].v ); // POTENTIAL BANG!
array[3].v = 7.0;
...
printf( "%f", array[3].v ); // THIS IS OK.
Run Code Online (Sandbox Code Playgroud)
不要忘记,对于庞大的POD阵列,有一个很好的简写,可以将所有成员初始化为零
MyPODStruct bigArray[1000] = { 0 };
Run Code Online (Sandbox Code Playgroud)