当你定义这样的空数组时,我想char t[2000] = "";
它会将该数组的所有元素设置为0
,但是当我创建一个 2000 大小的数组时,第 2000 个元素不是0
。与 3000 大小的数组相同,但其他大小(如 100(包含所有零。
为什么不是所有的元素都0
?
#include <stdio.h>
int main() {
char t[2000] = "";
for (int i; i <= 2000; i++) {
if (t[i] != 0) {
printf("nnt[%i] is not 0nnn", i);
}
printf("t[%i] = %in", i, t[i]);
}
return 0;
}
2000 元素数组只有从 0 到 1999 的合法索引(包括 0 到 1999(。访问t[2000]
在数组外部,调用未定义的行为。它不是阵列的一部分,它可以包含任何东西(或者只是让恶魔从你的鼻子里飞出来,等等(。这就是为什么典型的 Cfor
循环运行到i < arraylength
点,而不是直到i <= arraylength
点;必须将长度本身作为索引排除。
请注意,当您首先无法初始化i
时,您有第二位未定义的行为;您确实需要执行以下操作:
for(int i = 0; i < 2000; i++)
你的数组只有从t[0]
到t[1999]
的元素。当您尝试访问超出此范围的元素时,您将超出数组的边界,这会导致未定义的行为。
当您尝试访问元素t[2000]
时,不能保证其值可能是什么。
存储以前在某个时候分配给它的值,可能会给您运行时错误或任何其他错误。这无法确定,因此称为未定义行为。
它可能看起来工作正常,并给出预期的值而不给出任何错误(C 不检查数组边界(。
它可能会给你一个值,但不是你期望的值,而是一些以前存储的值。
因此,请记住,每当我们循环大小为s
的数组或字符串时,始终使用条件 -for(int i = 0 ; i < s ; i++)
而不是i<=s
这将导致非法访问t[2000]
。你永远不知道它会产生什么结果。