[英]Segmentation Fault in a C function
希望您度過了美麗的聖誕節假期。 我正在為考試而學習,我在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更改了所有變量,但沒有收到segfault,但在並集之后,我使用選擇排序對升序進行了排序,但返回的結果不正確值,但在第一個位置為負值。
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] where i>=0 means its a segmentation fault only
。
相反,您可以像這樣初始化
c[index_m];
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];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.