我很惊讶地看到一个新声明的数组正在被我的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]);
}
}
答案 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};
。
此外,未初始化变量包含的值不仅是垃圾值,而且可能是陷阱表示,只是访问它将导致未定义的行为。