c - 理解/澄清c代码的逻辑

标签 c arrays algorithm initialization

以下是来自 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/

相关文章:

java - 我有一种从 String[] 中删除空值的方法,我如何为该函数创建一个方法并稍后调用它? java

c++ - 如何处理在 C++ 中的类之间传递运行时大小的数组

javascript - 过滤所有属性和属性值

c# - 你能在 C# 中动态搜索字符串中的序列吗?

c - 是否可以在 C 中重载运算符?

c - 如何使用 for 循环在 C 中加载最多 10,000 个数字的数组?

c - 为什么C编译器不接受这个条件赋值?

c - 实现并行算法来计算 pi

algorithm - 与FFT算法混淆

c - 制作命名管道并使用轮询