为什么循环没有迭代预期的次数?

问题描述 投票:0回答:2
printf("Enter position : ");
    scanf("%d", &pos);
    printf("Enter element  : ");
    scanf("%d", &element);
    for ( i = 4; i >= (pos-1); i--)
    {   
        a[i+1]=a[i]; // why is this loop only working one time when pos=3
    }

这是我的代码部分,我试图将一个元素插入到大小为 5 的数组中 4 个元素开始将元素转移到下一个索引,但我正在从第五个元素本身转移,即 0(或垃圾值)。我知道这不是实现插入的正确方法,但我的 问题是为什么这行代码不起作用

a[i+1]=a[i];

循环似乎也没有工作 3 次而是 1 次。(这是我的主要问题)

我的原始代码:

#include<stdio.h>

int main(){
    int a[5],i, pos , element;
    printf("Enter elements : ");
    for ( i = 0; i < 4; i++)
    {
        scanf("%d",&a[i]);
    }
    printf("Enter position : ");
    scanf("%d", &pos);
    printf("Enter element  : ");
    scanf("%d", &element);
    for ( i = 4; i >= (pos-1); i--)
    {   
        a[i+1]=a[i];
    }
    a[pos-1]=element;
    for ( i = 0; i < 5; i++)
    {
       printf("%d ",a[i]);
    }
    
    return 0;
}
arrays c loops for-loop insertion
2个回答
1
投票

由于

a
被定义为
int a[5]
,它有从
a[0]
a[4]
的元素。考虑一下如果编译器将
i
放在
a[5]
所在的位置会发生什么。然后,当
i
为4时,
a[i+1] = a[i]
覆盖
i
,这可以将其更改为停止循环的值。


0
投票

这个for循环

for ( i = 4; i >= (pos-1); i--)
{   
    a[i+1]=a[i];
}

i

 等于 tp 
4
 时,
正在访问数组外的内存,因为表达式
a[i+1]
在这种情况下等同于
a[5]
而索引的有效范围是
[0, 4]
.

所以代码调用了未定义的行为。

您可以使用标准 C 字符串函数

memmove
,而不是编写容易出错的 for 循环
<string.h>
.

例如

#include <string.h>

//...

enum { N = 5 };
int a[N];

//...

if ( pos < N )
{
    memmove( a + pos + 1, a + pos, N - pos - 1 );
    a[pos] = element;
}
© www.soinside.com 2019 - 2024. All rights reserved.