c - C 函数中的段错误

标签 c arrays function memory

希望您度过了美好的圣诞节假期。我正在准备考试,我的 ANSI C 项目有问题。我的代码可以工作,但并不总是如此,这很奇怪,因为对于某些输入值,它适用于其他输入值。我有两个数组 A 和 B,它们的大小必须不同,我必须编写一个函数来对另一个数组中的两个数组进行数学并集。如果存在相同值的元素,我必须在新数组中只插入一个。我编写了所有代码(我还在这里发布了一个问题,因为我在 union 方面遇到了一些问题),但它并不总是有效。 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更改了所有变量,我没有收到段错误,但在 union 之后,我使用选择排序按升序排序,它返回我不是正确的值,而是在第一个位置的负值。

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
}

最佳答案

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

并且您正在为阵列分配零内存

如果您尝试 b[i]==c[i],其中 i>=0 表示仅存在段错误

相反,您可以像这样初始化,

c[index_m];

关于c - C 函数中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27779511/

相关文章:

c - 正在运行的函数暂停父函数

javascript - Angular - 无法迭代数组

javascript - $().live 不是函数 - JavaScript/jQuery

python - 'for' 循环和映射之间的区别

c - 填充轮廓的线性算法

无法在 cp 程序中打开文件

c++ - 我怎样才能确保内存映射文件保持内存页面可访问?

c - 不兼容类型错误

jquery - 必须访问 jquery 数组中的单个项目,然后模拟单击事件 (javascript)

excel - 仅当列标题包含特定文本时才使用 COUNTIF