为什么我们要在数组中插入超出其容纳量的元素

时间:2018-08-14 12:07:34

标签: 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 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);
}

输出:

Enter the values :1
2
3
4
5
6
7
1   2   3   4   5   6   7

3 个答案:

答案 0 :(得分:4)

C语言具有undefined behavior的概念。这意味着该语言不会阻止您执行不应执行的操作,但是如果您执行了该操作,则无法保证程序随后将执行的操作。

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

在这种情况下,您“很幸运”,似乎没有坏事发生。其他人运行同一程序可能会从您那里获得不同的输出,因为您写的是数组末尾。

运行此代码时,我得到以下输出:

Enter number  of elements which you want to append :6

Enter the values :1
2
3
4
5
6
7
*** stack smashing detected ***: ./x1 terminated
1   2   3   4   5   6   7   Aborted (core dumped)

答案 1 :(得分:1)

此代码导致未定义的行为,因为尝试访问数组外部的元素。有两种方法可以解决此问题:

  1. block[X]-X应该以固定大小定义。应将用户提供的值与X进行比较-然后确定,您不会跳出数组大小。
  2. block[X]-使用用户提供的X动态创建数组(请检查malloc()函数)

答案 2 :(得分:0)

在C数组中没有边界检查。您有一个int数组,它的宽度为5。如果您向数组中添加了五个以上未定义行为的元素,那么它不会止于五个元素。

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