2016-10-31 71 views
-1

我試圖運行一個程序,使用我用malloc()手動分配的數組。我free()此陣在我的節目的結束,但我不斷收到一個錯誤說*** glibc detected *** ./test: double free or corruption (!prev): 0x0000000002177010 *** 執行free()時出錯說「glibc檢測到雙免費或損壞」

這裏是我的主:

int main(int argc, char** argv) 
{ 
    pthread_t t1, t2, t3; 
    int i = 1; 
    int k = 0; 
    Client* clients; 
    clients = (Client*) malloc((nbClients+1)*sizeof(Client)); 
    for (i = 1; i <= nbClients+1; i++) 
    { 
     printf("\n----TICKET%d----\n", i); 
     clients[i].panier = (int*) malloc(nbArticles*sizeof(int));  
     achats(clients[i].panier, &clients[i].ticket); 

     for (k = 0; k < nbArticles; k++) 
     { 
      printf("panier[%d] = %d\n", k, clients[i].panier[k]); 

     } 

     pthread_create(&t1, NULL, calcMACL, &clients[i]); 

     //calcMQUAD(clients[i].panier, &clients[i].ticket); 
     //calcMACL(clients[i].panier, &clients[i].ticket); 
     //calcMCUBE(clients[i].panier, &clients[i].ticket); 

     pthread_join(t1, NULL); 
     //free(clients[i].panier); 

    } 

    free (clients); 




    return 0; 
} 

感謝您的幫助

回答

1

您正在訪問的邊界之外你分配的緩衝區,這可能會破壞malloc數據結構,導致你得到的錯誤。這是undefined behaviour

循環應該是:

for (i = 0; i < nbClients+1; i++) 

記住,指數從0 C.

+0

lmaooo是剛纔看到它,SRY我真的累了,我認爲 感謝你現在的工作 但我總是得到相同的值?這是正常的嗎? (我使用了一個隨機的int函數,並且它總是完全一樣) –

+1

我沒有看到任何隨機數的生成。您未發佈的代碼中可能存在其他問題。 – usr

+0

是的,它沒關係我糾正它(我沒有放任何種子),fanks –

2

free()失敗,這是因爲在你的程序中,所造成的錯誤一些內存損壞的開始。

在這種情況下,這是因爲循環for (i = 1; i <= nbClients+1; i++)訪問數組越界。

+0

lmaooo是剛剛看到它,斯里我真的很累我認爲 謝謝你現在的作品 但我總是得到相同的值?這是正常的嗎? (我使用一個隨機的int函數,它總是完全一樣!) –

+0

它沒關係我糾正它(我沒有放任何種子) –

1

C中的索引從零開始。最後索引客戶端nbClients + 1 - 1這意味着你的循環守衛是錯誤的。我會建議使用一個單獨的變量動態數組的長度和內存分配宏:

#define NEW_ARRAY(ptr, n) (ptr) = malloc((n) * sizeof (ptr)[0]) 

int clientsLen = nbClients + 1; 
NEW_ARRAY(clients, clientsLen); 
for (i = 0; i < clientsLen; i++) 
    ... 
+0

是的謝謝! –

+0

絕對沒有理由使用那個醜陋的宏。請不要建議人們混淆他們的代碼。你用這個宏實現的所有東西都是潛在的bug,而同時代碼變得更難讀。像函數一樣的宏是最後的手段,當你使用它們時,你必須絕對使用它們周圍的外部圓括號。 – Lundin

+0

@Lundin我不想在每次分配內存時進行容易出錯的大小計算。如果指針的類型或名稱發生更改,我也不希望在不必要的地方更新代碼。 「功能像宏是最後的手段」,我完全同意。 NEW_ARRAY被用作陳述,因此缺少外部括號。 –

相關問題