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