Kar*_*kar 0 c memory arrays loops
我观察到为数组分配的内存似乎是动态的.
以下是我在本教程中找到的示例代码:
#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]);
}
}
Run Code Online (Sandbox Code Playgroud)
和样本输出:
Run Code Online (Sandbox Code Playgroud)The original array elements are : LA[0]=1 LA[1]=3 LA[2]=5 LA[3]=7 LA[4]=8 The array elements after insertion : LA[0]=1 LA[1]=3 LA[2]=5 LA[3]=10 LA[4]=7 LA[5]=8
它的工作原理我没有得到.
首先,对于没有显式大小定义并使用大括号括起初始化程序初始化的数组的一般语句,大小将取决于初始化程序列表中的元素.所以,对于你的阵列
int LA[] = {1,3,5,7,8};
Run Code Online (Sandbox Code Playgroud)
大小将是5,因为你有5个元素.
C使用基于0的数组索引,因此有效访问将为0到4.
在你的代码中
LA[j+1] = LA[j];
Run Code Online (Sandbox Code Playgroud)
试图访问索引6,(5+1)这是超出限制的访问.这会调用未定义的行为.
具有UB的代码的输出不能以任何方式证明.
也就是说,main()根据最新的C标准,技术上是无效的签名.您至少需要使用int main(void)以使代码符合托管环境.