C函数中的分段错误

时间:2015-01-05 12:25:31

标签: c arrays function memory

我希望你度过了美好的圣诞假期。我正在攻读考试,我的项目在ANSI C中有问题。我的代码有效,但并非总是如此,这很奇怪,因为对于某些输入值,它适用于其他非。我有两个数组,A和B,它们的大小必须不同,我必须编写一个函数来完成另一个数组中两个数组的数学联合。如果有相同值的元素,我必须在新数组中只插入一个。我写了所有的代码(我在这里也发了一个问题,因为我在工会上遇到了一些问题),但它总是不起作用。 Gcc编译并执行,但它不正确。我用gdb调试了,它说

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400d1c in unionearraycrescente (a=0x7fffffffdd50, indice_m=4, 
b=0x7fff00000005, indice_n=5, minimo=6, indiceMinimo=22)
at array.c:152
152                 if(b[i]==c[j])

这是问题附近的代码

int arrayun(int a[], int index_m, int b[], int index_n, int minimum, int indexMinimum) 
{

    int i=0;
    int j=0;
    int found; 
    int lenc=0; 
    int c[lenc]; 
    for(i=0;i<index_m;i++){

        found = 0; 
        for(j=0; j<i && !found;j++)
            if(a[i]==c[j])
                found = 1;
        if(!found) 
            c[lenc++] = a[i];
    }
    for(i=0;i<index_n;i++){
        found=0;
        for(j=0;j<i && !found;j++)
            {
            if(b[i]==c[j]) //debug gbd problem - segfault
            found = 1;
            }
        if(!found)
            c[lenc++] = b[i];
    }

我是意大利语所以评论是用我的语言,如果你有任何问题,我会翻译评论。我只想解决这个内存错误。谢谢。

我遵循你的一些建议,在它运行的代码部分,我用index_m更改了所有变量,我没有收到段错误但是在联合之后我使用选择排序按升序排序并返回我不是正确的值,而是在第一个位置负值。

int arrayun (int a[], int index_m, int b[], int index_n, int minimum, int indexMinimum) 
{
    int i=0;
    int j=0;
    int found;
    int lenc; 
    int c[index_m]; 
    for(i=0;i<index_m;i++){

        found = 0;
        for(j=0; j<i && !found;j++)
            if(a[i]==c[j]) 

                found = 1; //setta trovato = 1
        if(!found) 
            c[index_m++] = a[i];
    }
    for(i=0;i<index_n;i++){ //index_m or index_n?
        found=0;
        for(j=0;j<i && !found;j++)
            {
            if(b[i]==c[j]) //debug gbd problem - segfault - SOLVED but
            found = 1;
            }
        if(!found)
            c[index_m++] = b[i];
    }


    for (i=0; i<index_m-1;i++)
    {
        minimum=c[i];
        indexMinimum=i;

        for (j=i+1;j<index_m; j++)
        {
            if (c[j]<minimum)
            {
                minimum=c[j];
                indiexMinimum=j;
            }
        }
        c[indexMinimum]=c[i];
        c[i]=minimum;
    }


   for(i=0;i<index_m;i++)
        printf("Element %d\n",c[i]);
    return c[index_m]; //I think here it's wrong
}

2 个答案:

答案 0 :(得分:2)

int c[lenc]; means in your program it is c[0] 

您正在为阵列分配 ZERO内存

如果您尝试b[i]==c[i] where i>=0 means its a segmentation fault only

相反,你可以初始化像,

c[index_m];

答案 1 :(得分:1)

int lenc=0;
int c[lenc]; 

这是0长度的数组。在循环中你试图访问c [1],c [2] ......等。

要解决此问题,您可以传递较大数组的长度

int unionearraycrescente (int a[], int index_m, int b[], int index_n,int len, int minimum, int indexMinimum)

and you can then initialize like
int c[len];