2016-10-31 4 views
-1

J'essaie d'exécuter un programme en utilisant un tableau que j'ai alloué manuellement avec malloc(). Je libre() ce tableau à la fin de mon programme, mais je continue à obtenir une erreur en disant *** glibc detected *** ./test: double free or corruption (!prev): 0x0000000002177010 *** Erreur lors de l'exécution de free() indiquant "glibc détecté double free ou corruption"

Voici mes principales:

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; 
} 

Merci pour votre aide

Répondre

1

Vous accédez en dehors des limites de la mémoire tampon que vous avez allouée, ce qui corrompt peut-être les structures de données malloc résultant de l'erreur que vous obtenez. C'est undefined behaviour.

La boucle doit être:

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

Rappelez-vous, l'indice commence à 0 en C.

+0

lmaooo oui juste vu, SRY je suis, je pense vraiment fatigué merci, il travaille maintenant mais j'ai toujours les mêmes valeurs? est-ce normal ? (J'utilise une fonction int aléatoire, et c'est toujours exactement la même chose) –

+1

Je ne vois aucune génération de nombres aléatoires. Vous pouvez avoir d'autres problèmes dans le code que vous n'avez pas publié. – usr

+0

oui c'est okay je l'ai corrigé (je n'ai pas mis de graine), fanks –

2

Lorsque free() échoue, il est en raison d'une corruption de mémoire dans votre programme, causée par des insectes.

Dans ce cas, c'est parce que la boucle for (i = 1; i <= nbClients+1; i++) accède au tableau hors des limites.

+0

lmaooo oui juste vu, sry je suis vraiment fatigué je pense merci ça marche maintenant mais je reçois toujours les mêmes valeurs? est-ce normal ? (J'utilise une fonction aléatoire int, et c'est toujours exactement la même chose!) –

+0

c'est bon je l'ai corrigé (je n'ai pas mis de graine) –

1

Les indices dans C commencent à partir de zéro. Le dernier index de clients est nbClients + 1 - 1 ce qui signifie que votre protège-boucle est incorrect. Je recommande d'utiliser une variable distincte pour la longueur du tableau dynamique et une macro pour l'allocation de mémoire:

#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

oui merci! –

+0

Il n'y a absolument aucune raison d'utiliser cette macro laide. S'il vous plaît, ne conseillez pas aux gens d'obscurcir leur code. Tout ce que vous avez réalisé avec cette macro est plus de potentiel de bug, tandis que le code devient plus difficile à lire. Les macros fonctionnelles sont le dernier recours, et quand vous les utilisez, vous devez absolument utiliser une parenthèse externe autour d'elles. – Lundin

+0

@Lundin Je ne veux pas faire un calcul de taille sujet aux erreurs chaque fois que j'alloue de la mémoire. Si le type ou le nom du pointeur change, je ne souhaite pas non plus mettre à jour le code à plus d'endroits que nécessaire. Avec "macros fonctionnelles est le dernier recours" Je suis entièrement d'accord. NEW_ARRAY doit être utilisé comme une déclaration, par conséquent le manque de parenthèses externes. –