这种在数组中插入的实现是否不正确?

时间:2016-09-26 00:44:55

标签: c arrays

我正在tutorialspoint.com上为Data Structures阅读教程。 在关于数组数据结构的部分中,这是一个在数组中插入元素的实现,它正在访问数组边界之外的元素:

   int LA[] = {1,3,5,7,8};
   int item = 10, k = 3, n = 5;
   int i = 0, j = n;

   printf("The original array elements are :\n");

   for(i = 0; i<n; i++) {
      printf("LA[%d] = %d \n", i, LA[i]);
   }

   n = n + 1;

   while( j >= k){
      LA[j+1] = LA[j];
      j = j - 1;
   }

   LA[k] = item;

   printf("The array elements after insertion :\n");

   for(i = 0; i<n; i++) {
      printf("LA[%d] = %d \n", i, LA[i]);
   }

是否正在访问数组未定义行为范围之外的元素,因此非常糟糕的做法? 如果是这样,为什么在教程中给出了这个?

2 个答案:

答案 0 :(得分:3)

  

没有访问数组未定义行为边界之外的元素

是。很好的发现。

  

因此非常糟糕的做法?

我不能与此争论,除非可能会说它有点低调。展示UB的程序是平的 错误

  

如果是这样,为什么在教程中给出了这个?

我只能推测,但教程的那一部分不仅错误,而且构思完全不好。 C数组具有固定长度,因此您无法在任何意义上“插入”C数组,而是保留已存在的所有值。 (我忽略了动态内存方法,这与所提供的代码无关。)

如果您调整它以避免读取或写入数组末尾,可以使用与示例中显示的代码类似的代码。这种“插入”元素的方法必须丢失最初在数组末尾的元素。

答案 1 :(得分:0)

当然这是一种不好的做法。当你尝试做

   while( j >= k){
      LA[j+1] = LA[j];
      j = j - 1;
   }

...当LA的大小为5时,你将让LA [6]接收一个值。然后会显示一条错误信息,在某一时刻执行将被中止。除此之外,退出状态(echo $?)将为零,即,表示您的程序未成功完成。