2012-10-07 107 views
1

我有問題,我的學校項目,該項目正在測試這個版本的服務器返回此錯誤:分割故障C,malloc的陣列

./__runscript: line 2: 489 Segmentation fault ./a.out < __input 

編譯是確定的,但它開始運行就當顯示此錯誤。但如果我在Windows 7上使用visual studio 10運行它,一切都很好。我認爲這個錯誤可能在insert()函數中。

POSTUP *insert(POSTUP *first) 
{ 
    POSTUP* current,*pom; 
    current=(POSTUP*)malloc(sizeof(POSTUP)); 
    pom=(POSTUP*)malloc(sizeof(POSTUP)); 
    int i,count_of_elements; 

    scanf("%d", &count_of_elements); 

    if(first==NULL) 
    { 
     first=current; 
     first->array= (int*)malloc(count_of_elements*sizeof(int)); 
     for(i=0; i<count_of_elements; i++) 
     { 
      scanf("%d",&first->array[i]); 
     } 
     first->elements=count_of_elements; 
     first->next=NULL; 
     return first; 
    } 
    else 
    { 
     pom->array= (int*)malloc(count_of_elements*sizeof(int)); 
     for(i=0; i<count_of_elements; i++) 
     { 
      scanf("%d",&pom->array[i]); 
     } 
     pom->next=NULL; 
     pom->elements=count_of_elements; 
     current=first; 
     while(1) 
     { 
      if(current->next==NULL) 
      { 
       current->next=pom; 
       return first; 
      } 
     } 
    } 
    return 0; 
} 
int main(void) 
{ 
    int count, i; 
    POSTUP* first,*current; 
    first= (POSTUP*)malloc(sizeof(POSTUP)); 
    first=NULL; 

    scanf("%d",&count); 
    for(i=0; i<count; i++) 
    { 
     first=insert(first); 

    } 
}  
+1

'pom'如果'first'是'NULL'就會泄漏,否則'current'會泄漏。爲什麼不分配一個新節點? – nneonneo

+0

'scanf(「%d」,&prvy-> array [i]);' - 爲什麼不'&first-> array [i]'在這裏?什麼是「prvy」? – nneonneo

+1

每次都會發生主要泄漏.... –

回答

1

這段代碼在main()

POSTUP *first, *current; 
first = (POSTUP*)malloc(sizeof(POSTUP)); 
first = NULL; 

scanf("%d", &count); 
for (i = 0; i < count; i++) 
{ 
    first = insert(first); 
} 

顯然是有問題的。您分配空間並將唯一的指針存儲在first;然後你覆蓋指針,泄漏內存。您應該正式檢查分配是否爲空。但是您的insert()代碼可以處理空指針作爲輸入,因此main中的內存分配是多餘的。

insert()中,您分配內存時未檢查成功;這是麻煩的祕訣,儘管通常比遲早更早。

你的代碼永遠不會檢查scanf()的結果;這意味着如果數據中存在格式錯誤,您可能會將垃圾收集到您的系統中。

崩潰的可能的原因:在「如果(第一== NULL)block in插入()',你必須:

有一個在你展示的代碼prvy看不到的聲明;無論如何,它幾乎肯定是指&first->array[i]。這可能很容易導致崩潰。否則,您已經仔細地將數據存儲在與您想象不同的一組內存中,因此first的數組是未初始化的亂碼。

相同的代碼不使用pom,所以你已經在這部分代碼中泄漏了內存。

insert()的主要else子句中,您覆蓋了current(其中包含內存分配)與first,因此也在那裏泄漏內存。

在你要使用它之前不要分配內存。

+0

感謝您的回答,這個'prvy'是一個bug,我只是編輯 – Patrik18