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

C-新声明的数组被其他变量的值污染,c,arrays,C,Arrays,当我看到一个新声明的数组被我的C程序中其他变量的一些随机值和部分值所限制时,我感到非常震惊 这是我函数的源代码。我基本上是在编写一些伪代码,以准备执行一些复杂的XML解析和文件操作(类似于邮件合并)。无论如何,我关心的是在我新声明的数组中是否有随机值。为什么我第一次声明它时它没有值? 在开始赋值之前,我真的需要遍历整个数组以将其元素设置为空值,还是代码中的其他变量声明可能有问题 谢谢你的帮助 问候,, 克里斯 void ShowArray(void) { 字符字符串[5][5][255]; sp

当我看到一个新声明的数组被我的C程序中其他变量的一些随机值和部分值所限制时,我感到非常震惊

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

谢谢你的帮助

问候,, 克里斯

void ShowArray(void)
{
字符字符串[5][5][255];
sprintf(aryString[1][1],“AAAA”);
sprintf(aryString[1][2],“bbb”);
sprintf(aryString[1][3],“CCCCC”);
sprintf(aryString[1][4],“ddd”);
sprintf(aryString[1][5],“EEEEE”);
sprintf(aryString[2][1],“A2”);
sprintf(aryString[2][2],“B2”);
int numRow;
国际货币基金组织;
对于(numRow=1;numRow<6;numRow++)
{
对于(numCol=1;numCol<6;numCol++)
printf(“%d,%d:%s\n”,numRow,numCol,aryString[numRow][numCol]);
}
}

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

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


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

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

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

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


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

“我很震惊地看到,新声明的数组正在与我的C程序中其他变量的一些随机值和部分值进行限制。”欢迎来到拥有所有未定义行为的C的快乐世界。:)感谢你们所有人的及时和有益的回应!这些值不会来自“以前的程序”。它们将来自同一进程中的其他函数调用。您不应该看到跨进程内存污染。对不起,我完全忘记了虚拟内存之类的东西
    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]);
    }
}