为什么在c中此程序中的细分故障错误



为什么此代码中DR分割故障?这里的一切看起来都正确,语法...。。程序很简单,只有两个数组的两个阵列的两种内容;所以我服用了两个阵列array1array2第三个是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("%dn", 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("%dn", array[i]);
    }
    return 0;
}

因为 this 不是您想要的:

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时,右侧有 no 元素。其次,j循环从i开始,我们知道 array[x] > array[x]永远不会是正确的(x,因为i == j)。

最好使用:

for (i = 0; i < l3 - 1; i++) {
    for (j = i + 1; j < l3; j++) {

删除这些效率低下。

行:

//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("%dn", array[i]);
}

l3值在访问数组的第30个位置时可能会超过20个,将导致分割故障。

因为您超出了数组的大小

检查此指令:int I3 = I1+I3您应该用int I3 = I1+I2

替换它

相关内容

  • 没有找到相关文章

最新更新