在C/C++中初始化数组是一种好习惯吗?

san*_*and 9 c c++ arrays array-initialization

我最近遇到一个案例,我需要比较两个文件(黄金和预期)来验证测试结果,即使写入两个文件的数据相同,文件也不匹配.

在进一步调查中,我发现有一个结构包含一些整数和一个64字节的char数组,并且在大多数情况下并没有使用char数组的所有字节,并且数组中未使用的字段包含随机数据造成了不匹配.

这让我想问一个问题是,在C/C++中初始化数组是否也是一个好习惯,就像在Java中完成一样?

Jas*_*ams 23

在使用它们之前初始化内存/变量是一个好习惯 - 未初始化的变量是通常很难追踪的错误的重要来源.

在将其写入文件格式时初始化所有数据是一个非常好的主意:它使文件内容更清晰,因此更容易使用,如果有人错误地尝试"使用"未初始化的数据,则不太容易出现问题(请记住它可能不仅仅是你自己的代码,将来读取数据),并使文件更具可压缩性.

在使用变量之前不进行初始化的唯一理由是在性能关键的情况下,初始化在技术上是"不必要的"并且会产生很大的开销.但在大多数情况下,初始化变量不会造成重大损害(特别是如果它们仅在使用之前立即声明),但通过消除常见的错误来源可以节省大量的开发时间.

  • 只是向同一方向提供了一些提示:为变量使用最小的范围.声明后直接初始化.仅将变量用于一个目的.如果您希望变量不更改值,请使用const.这些提示的主要原因是:它们提高了可读性并减少了代码更改过程中出现细微错误的可能性.代码现在可能是无错误的,没有遵循这些提示 - 但是跟随它们,每次代码更改都更容易保持bug. (8认同)

Mic*_*son 5

在数组中使用未定义的值会导致未定义的行为.因此,该程序可以自由地产生不同的结果.这可能意味着您的文件最终略有不同,或程序崩溃,或程序格式化您的硬盘驱动器,或程序导致恶魔飞出用户鼻子(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)