我正在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]);
}
是否正在访问数组未定义行为范围之外的元素,因此非常糟糕的做法? 如果是这样,为什么在教程中给出了这个?
答案 0 :(得分:3)
没有访问数组未定义行为边界之外的元素
是。很好的发现。
因此非常糟糕的做法?
我不能与此争论,除非可能会说它有点低调。展示UB的程序是平的 错误 。
如果是这样,为什么在教程中给出了这个?
我只能推测,但教程的那一部分不仅错误,而且构思完全不好。 C数组具有固定长度,因此您无法在任何意义上“插入”C数组,而是保留已存在的所有值。 (我忽略了动态内存方法,这与所提供的代码无关。)
如果您调整它以避免读取或写入数组末尾,可以使用与示例中显示的代码类似的代码。这种“插入”元素的方法必须丢失最初在数组末尾的元素。
答案 1 :(得分:0)
当然这是一种不好的做法。当你尝试做
while( j >= k){
LA[j+1] = LA[j];
j = j - 1;
}
...当LA的大小为5时,你将让LA [6]接收一个值。然后会显示一条错误信息,在某一时刻执行将被中止。除此之外,退出状态(echo $?)将为零,即,表示您的程序未成功完成。