为什么c语言中的程序会出现分段错误?

为什么c语言中的程序会出现分段错误?,c,arrays,sorting,segmentation-fault,C,Arrays,Sorting,Segmentation Fault,为什么此代码中存在dr分段错误? 这里的一切看起来都是正确的,语法。。。该程序简单,只需将两个数组中的两个内容排序为第三个数组;因此,我使用了两个数组array1和array2 第三个是数组,在其中进行排序 #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];

为什么此代码中存在dr分段错误? 这里的一切看起来都是正确的,语法。。。该程序简单,只需将两个数组中的两个内容排序为第三个数组;因此,我使用了两个数组
array1
array2
第三个是
数组
,在其中进行排序

#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;
}
#包括
int main()
{
int array1[10]={1,2,4,5,7,8,45,21,78,25};
int array2[5]={3,6,9,15,17};
int数组[20];
int i,j,温度;
int l1=sizeof(array1)/sizeof(int);
int l2=sizeof(array2)/sizeof(int);
int l3=l1+l3;
对于(i=0;i
int l3 = l1 + l3;
它只需将已知的
l1
添加到任意的
l3
,给您一个稍大的任意值。相反,它应该是:

int l3 = l1 + l2;

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

for (i = 0; i < l3; i++) {
    for (j = i; 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("%d\n", array[i]);
}

用于(i=0;i,因为超出了数组的大小


检查此说明:
int I3=I1+I3
您应该将其替换为
int I3=I1+I2

基本调试技术:添加跟踪输出。检查您的假设。(在这种情况下,在数组索引上。)最后一个声明行上的
int l3=l1+l3
可能导致使用类似于
gcc-Wall-g yourSrc.c debug的东西进行编译,并通过调试器运行(
gdb debug
命令,例如)
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]);
}