为什么c这个程序中的分段错误错误?

-1 c arrays sorting segmentation-fault

为什么这段代码中的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;
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 5

因为不是你想要的:

int l3 = l1 + l3;
Run Code Online (Sandbox Code Playgroud)

它将简单地添加已知l1的任意值l3,给你一个稍大的任意值.相反,它应该是:

int l3 = l1 + l2;
Run Code Online (Sandbox Code Playgroud)

另一个虽然相对较小的问题是算法的效率,特别是循环的开始和结束条件.代码:

for (i = 0; i < l3; i++) {
    for (j = i; j < l3; j++) {
Run Code Online (Sandbox Code Playgroud)

有两个问题.首先,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++) {
Run Code Online (Sandbox Code Playgroud)

消除这些低效率.