在 C 中,空字符数组 [2000] 是否包含所有零?



当你定义这样的空数组时,我想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]。你永远不知道它会产生什么结果。

最新更新