为什么这段代码中的dr分段错误?
这里的一切看起来都很正确,语法......等等。程序很简单,只需将两个数组的两种内容分成第三个数组;所以我采用了两个数组array1
和array2
第三个是array
,其中要进行排序。
#include<stdio.h>
int main()
{
int array1[10] = {1, 2, 4,5,7,8,45,21,78,25};
int array2[5] = {3, 6, 9,15,17};
int array[20];
int i,j,temp;
int l1 = sizeof(array1)/sizeof(int);
int l2 = sizeof(array2)/sizeof(int);
int l3 = l1+l3;
for (i = 0;i < l1; i++)
{
array[i]=array1[i];
}
for (i = 0;i < l2; i++)
{
array[i+l1]=array2[i];
}
for (i = 0;i < (l1+l2); i++)
{
printf("%d\n", array[i]);
}
printf("\nSorted array:\n");
for(i=0;i<l3;i++)
{
for(j=i;j<l3;j++)
{
if(array[i] > array[j])
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
for (i = 0;i < l3; i++)
{
printf("%d\n", array[i]);
}
return 0;
}
答案 0 :(得分:5)
因为这个不是您想要的:
int l3 = l1 + l3;
它只会将已知l1
添加到任意l3
,为您提供稍大的任意值。相反,它应该是:
int l3 = l1 + l2;
另一个虽然相对较小的问题是算法的效率,特别是循环的开始和结束条件。代码:
for (i = 0; i < l3; i++) {
for (j = i; j < l3; j++) {
有两个问题。首先,i
循环走得太远,因为我们知道当它在l3 - 1
时,右边有没有元素。其次,j
循环从i
开始,我们知道 array[x] > array[x]
永远不会为真(x
因为i == j
)。
最好使用:
for (i = 0; i < l3 - 1; i++) {
for (j = i + 1; j < l3; j++) {
消除这些低效率。
答案 1 :(得分:1)
在行中:
// l3将具有垃圾值,该值可能大于20(阵列的最大大小)
int l3 = l1 + l3;
在循环中使用它时
for(i=0;i<l3;i++)
{
for(j=i;j<l3;j++)
{
if(array[i] > array[j])
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
for (i = 0;i < l3; i++)
{
printf("%d\n", array[i]);
}
当访问阵列的第30个位置时,l3值可能超过20表示30将导致分段故障。
答案 2 :(得分:1)
因为你超出了数组的大小
查看此说明:int I3 = I1+I3
您应该将其替换为int I3 = I1+I2