int LA [] = {1,2,3,4,5}内存分配混乱c

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)

和样本输出:

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
Run Code Online (Sandbox Code Playgroud)

它的工作原理我没有得到.

Sou*_*osh 5

首先,对于没有显式大小定义并使用大括号括起初始化程序初始化的数组的一般语句,大小将取决于初始化程序列表中的元素.所以,对于你的阵列

 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)以使代码符合托管环境.

  • @Karunakar只需更改源代码即可学习C.发布此类代码的人不应该教C! (4认同)
  • @Karunakar你应该参考另一个教程.您链接的代码与您的代码一样错误. (4认同)