C 为什么我们可以在数组中插入比它能容纳的更多的元素

C 为什么我们可以在数组中插入比它能容纳的更多的元素,c,arrays,C,Arrays,在下面的代码中,我在数组中插入了6个元素。但是,数组大小为5,for循环运行7次。然后,代码插入并打印7个元素 数组的大小似乎无关紧要,因为我显然可以插入和打印更多的元素。如果是这样,那么为什么还要声明数组的大小呢 #include<stdio.h> #include<stdlib.h> int main() { int index, block[5], number; printf("\nEnter number of elements which

在下面的代码中,我在数组中插入了6个元素。但是,数组大小为5,for循环运行7次。然后,代码插入并打印7个元素

数组的大小似乎无关紧要,因为我显然可以插入和打印更多的元素。如果是这样,那么为什么还要声明数组的大小呢

#include<stdio.h>
#include<stdlib.h>


int main()
 {
   int index, block[5], number;

   printf("\nEnter number  of elements which you want to append :");
   scanf("%d", &number);
   printf("\nEnter the values :");
   for (index = 0; index <= number; index++)
   {
       scanf("%d", &block[index]);
   }
   for (index = 0; index <= number; index++)
   {
       printf("%d\t", block[index]);
   }
   return (0);
}

C语言的概念是。这意味着语言不会阻止你做不该做的事情,但是如果你做了,就不能保证程序会在以后做什么

它可能会崩溃,可能会输出奇怪的结果,或者看起来工作正常。如果您进行看似不相关的代码更改,例如添加未使用的局部变量、添加用于调试目的的printf调用或使用不同的优化设置进行编译,则未定义的行为本身的显示方式可能会发生变化

在这种情况下,你很幸运,似乎没有什么坏事发生。其他运行相同程序的人可能会从您那里获得不同的输出,因为您写入的内容超过了数组的末尾

当我运行这段代码时,我得到了以下输出:

输入要附加的元素数:6 输入值:1 2. 3. 4. 5. 6. 7. ***检测到堆栈崩溃***:./x1已终止 1 2 3 4 5 6 7中止堆芯转储
此代码导致未定义的行为,因为有人试图访问数组外部的元素。有两种方法可以解决此问题:

块[X]-X应定义为固定大小。用户提供的值应该与X进行比较-然后您可以确定,您没有跳出数组大小。 块[X]-使用用户检查malloc函数提供的X动态创建阵列
在C中,数组没有边界检查。你有一个int数组,它的宽度是5。如果向未定义行为的数组中添加五个以上的元素,它不会仅在五个元素处停止


用户有责任确保数组边界不超过分配的范围。

C语言给了程序员几乎全部的自由,即使有违反语言规则的事情,比如在数组边界之外写入。可以,但是语言本身不能保证程序会发生什么。它被称为Undefined Bahavior,在某些情况下,它可能是一个伟大但危险的工具,在其他情况下,它可能是一个诅咒。实际上,99.99%的情况下,或者100%的情况下,对于初学者程序员来说,每天凌晨3点,我从家里走到街对面的通宵餐厅。十字路口有一个步行/不步行的标志,但从来没有任何交通,我等得很累,所以我开始过马路,尽管标志上写着“不要步行”。没有坏事发生。如果我可以随时交叉,那么使用“行走/不行走”标志有什么意义呢?请使用链接的规范副本来回答此类常见问题。我想这是第三个为什么我今天可以单独访问数组出界的问题。这不是OP要问的。所以,在你看来。。。OP到底在问什么?我的回答和其他人一样-是UB。它清楚地说明,如果是这样,那么为什么还要声明数组的大小?现在请阅读您的回答。好的,主要帖子已经编辑好了-现在有适当的问题。我不会重复已经公布的更详细的答案。公平地说,我对你的答案做了一个微不足道的修改,这样我就可以撤回投票。这不再是你的错了。
Enter the values :1
2
3
4
5
6
7
1   2   3   4   5   6   7