以下是来自 www.tutorialspoint.com 的代码,我正在其中学习算法和数据结构的基础知识。本教程代码给出了一个例子。数组的插入操作。
#include <stdio.h>
main() {
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]);
}
}
我理解代码,它在给定的 k 值处添加新项目作为数组的索引。并且在编译和运行时运行良好,没有任何错误。让我困惑的是 while 循环中 LA[j+1] = LA[j]
行的逻辑。
我的理解是,在c中你必须声明数组的大小。但在前。 code int LA[] = {1,3,5,7,8};
括号 [ ] 为空。所以我不确定它是否是固定大小或可以将更多元素添加到数组中。
现在,j
的值为 n
,即 5(数组长度)。数组声明有5个元素,数组索引为0到4。
(在 while 循环的第一次迭代中)因此 LA[j + 1]
是 LA[5 + 1]
是 LA[6]
>。现在数组只有 5 个索引为 0 到 4 的元素。因此,根据我的说法,即使假设可以向数组添加更多元素,它如何将 5 的 LA[j]
值分配给 LA[j + 1]
。它说 LA[6] = LA[5] 但索引 5 处没有任何内容,因为最后一个索引是 4。
我尝试在谷歌上搜索,但除了代码或部分代码之外,我不知道要搜索什么。并且使用代码搜索没有帮助。
请帮我理解一下。谢谢。
最佳答案
int LA[] = {1,3,5,7,8};
相当于:
int LA[5] = {1,3,5,7,8};
空括号只是告诉编译器自动将元素数量设置为数组的大小。
是的,你是对的,L[6]
是越界访问,因为 L
的大小为 5。所以,正如你所说,索引是在 [0, 4] 中,所以 L[5]
也出界了!
这段代码是错误的!
了解有关未定义行为的更多信息:Undefined, unspecified and implementation-defined behavior
关于c - 理解/澄清c代码的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38011173/