我是C的新手,正在编写一个函数来将元素插入到排序列表中。但我的代码没有正确显示最后一位数字。虽然我知道有多种方法可以纠正它,但我想知道为什么我的代码不起作用,这里是代码
#include <stdio.h>
int insert(int array[],int val);
int main (void)
{
int arr[5],j;
for (j = 0; j<5; j++)
{
scanf("%d",&arr[j]);
}
insert(arr,2);
for(j = 0;j<6;j++)
printf("%d",arr[j]);
return(0);
}
int insert(int array[],int val)
{
int k,i;
for (k = 0;k<5;k++)
if(val<array[k])
break;
for (i = 4; i>=k;i--)
{
array[i+1] = array[i];
}
array[k] = val;
return(1);
}
答案 0 :(得分:3)
你在这里写出数组的范围:
for (i = 4; i>=k;i--)
{
array[i+1] = array[i];
i+1 == 5
和你的数组的范围是0 ...
4
然后你尝试打印数组,但你再次出界:
for(j = 0;j<6;j++)
printf("%d",arr[j]);
首先确保您的阵列足够大。
答案 1 :(得分:0)
当你为一个插入元素的函数提供一个static / auto数组时,你必须给出:Address,Valid length和Buffer Space,除非保证足够大。
当给出一个动态分配的数组时,你必须给出指针和有效长度,你可以给出缓冲区空间或保证留下足够的空间以避免重新分配。
否则,您冒着缓冲区溢出的风险,UB意味着可能发生任何事情,如您的示例所示。
答案 2 :(得分:0)
你试图让arr [6]从arr [5]中添加一个val - 在C中使用静态分配的数组是不可能的。 要完成您尝试做的事情,您需要使用动态数组分配:
int *arr;
int N = 5;
arr = (int *)malloc(N*sizeof(int));
然后你使用这个arr [5]的方式与通过scanf加载数据一样。 稍后,在为数组添加额外值时 - 您需要重新分配您的arr以使其更大(阅读malloc / realloc C函数):
arr = (int *)realloc((N+1)*sizeof(int));
现在你的arr是6 int-s大小。 不幸的是,如果您不知道数组大小(元素数量),则需要在C中处理动态内存分配。
不要忘记在main()函数的末尾释放该内存:
free(arr);
答案 3 :(得分:0)
在数组中插入一个新元素时,必须将数组大小从5增加到6,因此应该有一些空间。
int arr [6];
您还可以在下面的链接中找到更多信息: https://learndswithvishal.blogspot.com/2020/06/insert-element-in-sorted-array.html