C - 新声明的数组被其他变量的值污染



我很震惊地看到一个新声明的数组被我的 C 程序中其他变量的一些随机值和一些部分值所包围。

这是我函数的源代码。 我基本上是在编写一些伪代码,以准备进行一些复杂的XML解析和文件操作(类似于邮件合并)。 无论如何,我担心我新声明的数组中是否有随机值。 为什么当我第一次声明它时它没有值?在开始赋值之前,我真的需要遍历整个数组以将其元素设置为空白值,还是代码中的其他变量声明有问题?

谢谢你的帮助。

问候克里斯

    void ShowArray(void)
    {
            char aryString[5][5][255];
            sprintf(aryString[1][1],"AAAAA");
            sprintf(aryString[1][2],"BBBBB");
            sprintf(aryString[1][3],"CCCCC");
            sprintf(aryString[1][4],"DDDDD");
            sprintf(aryString[1][5],"EEEEE");
            sprintf(aryString[2][1],"A2");
            sprintf(aryString[2][2],"B2");
            int numRow;
            int numCol;
            for (numRow=1;numRow < 6;numRow++)
            {
                    for (numCol=1;numCol < 6;numCol++)
                            printf("%d,%d:%sn", numRow, numCol,aryString[numRow][numCol]);
    }
}
不幸的是,

您必须初始化数组中每个元素的值。

首次声明数组和变量时,让随机值填充它是正常的。这是因为当您的计算机释放内存时,它不会将它们重置为零。您的计算机只允许其他程序覆盖那些新释放的内存位置中的值。

这些未初始化的值只是其他函数的剩余部分。

函数中的局部变量将具有最初未定义的值。 事实上,这就是你想要的,因为另一种选择是编译器强制初始化,在大多数情况下你不想要,这不可避免地会减慢你的函数。 在尝试使用任何变量的值之前,您有责任确保已正确定义任何变量。 我从来没有发现这是一个问题。

您还使用 sprintf 写入代码中的第 [1][5] 个字符串。您的 aryString 变量的维度为 [5][5][255]。请记住,C 中的数组索引是从 0 开始的。您不应超出第 [1][4] 个元素。您可能希望删除该行并重试,因为您最终会自己损坏自己的数据。

是的,您在函数调用中声明的所有auto变量(与显式声明的static相反)用于手动初始化。编译器不会自动初始化它,因为它不知道您要写入该内存的内容。要使其将默认值(通常00000000)写入未初始化的变量,请写入char aryString[5][5][255] = {};,或者更常见的是char aryString[5][5][255] = {0};

此外,未

初始化的变量包含的值不仅是垃圾值,而且很可能是陷阱表示形式,仅访问它会导致未定义的行为。

最新更新