希望您度过了美好的圣诞节假期。我正在准备考试,我的 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/