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

时间:2016-02-07 03:54:10

标签: c arrays

我很惊讶地看到一个新声明的数组正在被我的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:%s\n", numRow, numCol,aryString[numRow][numCol]);
    }
}

4 个答案:

答案 0 :(得分:1)

不幸的是,你必须初始化数组中每个元素的值。

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

那些未初始化的值只是其他函数的遗留物。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您还使用sprintf在代码中写入[1] [5]字符串。您的aryString变量的尺寸为[5] [5] [255]。请记住,C中的数组索引是基于0的。你不应该超越[1] [4]元素。您可能希望删除该行并重试,因为您最终会自行破坏自己的数据。

答案 3 :(得分:0)

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

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