2017-04-09 1 views
-1

il me montre une erreur sur le libre Erreur dans` ./program.o': double gratuit ou la corruption (out): 0x0000000002316030 ce que je peux faire avec le code, ce que je fais mal avec le libre? Merci.J'ai un problème avec free: Erreur dans `./program.o ': double gratuit ou corruption (out): 0x0000000002316030

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void setInOrderArr(int *arrArr[], int len); 

void printArrays(int *arrArr[], int len); 

void setInOrderAll(int *arrArr[], int len); 


int main(void) 
{ 

    int rows = 0; 
    int length = 0; 
    int i = 0; 
    int j = 0; 
    printf("Enter number of rows: "); 
    scanf("%d", &rows); 
    int ** arrArr = (int**)malloc(sizeof(int)*rows); 

    for (i = 0; i < rows; i++) 
    { 
     printf("Enter array length for row %d: ",i); 
     scanf("%d", &length); 
     arrArr[i] = malloc(sizeof(int)* (length + 1)); 
     arrArr[i][0] = length; 
     for (j = 0; j < length; j++) 
     { 
      printf("Enter value for array: "); 
      scanf("%d",&arrArr[i][j+1]); 
     } 
    } 
    printArrays(arrArr, rows); 
    setInOrderArr(arrArr, rows); 
    printArrays(arrArr, rows); 
    setInOrderAll(arrArr, rows); 
    printArrays(arrArr, rows); 

    for (i = 0; i < rows; i++) 
    { 
     free(arrArr[i]); 
    } 
    free(**arrArr); 

    return 0; 
} 


void setInOrderArr(int *arrArr[], int len) 
{ 

    int i = 0; 
    int j = 0; 
    int k = 0; 
    int temp = 0; 
    int temp2 = 0; 
    for (i = 0; i < len; i++) 
    { 
     for (j = 1; j < arrArr[i][0]; j++) 
     { 
      for (k = 1; k < arrArr[i][0]; k++) 
      { 
       temp = arrArr[i][k]; 
       if (arrArr[i][j + 1] < temp) 
       { 
        temp2 = arrArr[i][j + 1]; 
        arrArr[i][j + 1] = temp; 
        arrArr[i][k] = temp2; 
       } 
      } 
     } 
    } 
} 


void printArrays(int *arrArr[], int len) 
{ 

    int i = 0; 
    int j = 0; 
    static int times = 0; 
    if (times == 0) 
    { 
     printf("Printing:\n"); 
    } 
    else if (times == 1) 
    { 
     printf("Sorted rows:\n"); 
    } 
    else if (times == 2) 
    { 
     printf("Ordered array:\n"); 
    } 

    for (i = 0; i < len; i++) 
    { 
     for (j = 1; j <= arrArr[i][0]; j++) 
     { 
      printf("%d ", arrArr[i][j]); 
     } 
     printf("\n"); 
    } 
    times++; 
} 

void setInOrderAll(int *arrArr[], int len) 
{ 

    int i = 0; 
    int j = 0; 
    int** arrTmp = { 0 }; 
    for (i = 0; i < len; i++) 
    { 
     for (j = 0; i < len - 1 - j; j++) 
     { 


      if (arrArr[j][0] > arrArr[j + 1][0]) 
      { 

       arrTmp = arrArr[j]; 
       arrArr[j] = arrArr[j + 1]; 
       arrArr[j + 1] = arrTmp; 
      } 

     } 
    } 
} 

il me montre une erreur sur le sans erreur dans `./program.o ': à double libre ou la corruption (out): 0x0000000002316030 ce que je peux faire avec le code, ce que je fais mal avec le gratuit? Merci.

+0

'free (** arrArr);' -> 'free (arrArr);' – StoryTeller

+2

Jetez un coup d'œil à cet appel initial 'malloc'. Que pensez-vous qu'il se passe si sizeof (int)! = Sizeof (int *) '(ce qui est très probable sur un système 64 bits)? –

+0

Faites le 2ème 'free()' comme vous le faites pour le 1er. Transmettez ce qui a été renvoyé par la fonction d'allocation ('malloc()' ici). Ici 'int ** arrArr = ...' le '**' fait partie du type de la variable. Cela ne fait pas partie de son nom. – alk

Répondre

1

Modifier la ligne free(**arrArr); à free(arrArr); devrait résoudre le problème. Passez free() directement avec le pointeur.

arrArr est de type int **: comme tableau 2D

*arrArr est de type int *: comme tableau 1D

**arrArr est de type int: juste un nombre entier

Tout comme vous ne pouvez pas appeler free(123), vous ne pouvez pas tous free(**arrArr)

+0

J'ai essayé et son vol ne fonctionne pas – MorByoseF

+0

@MorByoseF Si vous avez un pointeur '**' vous avez besoin d'une boucle pour allouer et libérer la mémoire de chaque '*' poitner, et puisque vous êtes un débutant, il pourrait y avoir d'autres erreurs cela provoque un comportement indéfini qui ne déclenche pas une erreur de segmentation ou d'autres probelms liés à la mémoire jusqu'à ce que vous appeliez 'free()'. Mais cette réponse devrait résoudre le problème, 'free (arrArr)'. –

+0

@MorByoseFI a exécuté votre programme [ici] (https://ideone.com/LW57JP), il y avait quelques autres fautes de frappe et je l'ai réparé, vous pouvez jeter un oeil. – xhg

1

Si vous lisez la documentation ou la spécification standard, vous comprendrez une caractéristique fondamentale de free()

  • passer à free() un pointeur qui n'a pas été retourné par malloc()/ou calloc()realloc() est un comportement non défini.

Vous aller plus loin et passer une valeur de pointeur non de type int, ce qui est une autre raison pour un comportement non défini, parce que le programme va essayer de libérer la mémoire à une adresse invalide qui est la valeur stockée dans la première position du tableau arrArr.

En outre, notez que j'ai souligné le mot pointeur ci-dessus. Encore une fois la lecture de la documentation vous permettra de savoir que la signature de free() est

void free(void *); 

si le passage d'un int devrait générer un avertissement comme conversion en entier en pointeur sans fonte ou similaire.

une chose, si vous activez les avertissements du compilateur vous pouvez apprendre beaucoup de choses sur la langue c des mises en garde et bien sûr une partie de votre propre intuition. Si vous aviez activé l'alerte, puis les ignorer est un très mauvais signe, vous devez réaliser que vous en tant que beginer ferez beaucoup d'erreurs simples que les avertissements avertissent, les avertissements sont utilisés des programmeurs expérimentés pour trouver des problèmes simples dans leur code comme l'attribution accidentellement à la place de comparer deux valeurs.

Donc, en résumé,

  1. Lire la documentation avant d'utiliser une fonction .
  2. NE PAS ignorer les avertissements.