2017-04-27 5 views
0

J'ai écrit la fonction suivante:à double libre ou la corruption (en haut) dans la section SI de la fonction

/*! 
* @brief Checks if a string contains a certain keyword 
* @param char *chkstring - String to search in 
* @param char *keyword - String to search for 
* @return int - 1 if found, 0 if not found 
*/ 

int check_string(char *chkstring, char *keyword) 
{ 
    char *buffer; 
    char *buffer2; 
    buffer = malloc(256); 
    buffer2 = malloc(256); 
    strcpy(buffer2,chkstring); 

    if((buffer = strstr(buffer2,keyword)) != NULL)  // Check for first appearance of keyword in chkstring 
    { 
     //free(buffer); // <- Problem sits here         
     //free(buffer2); // and/or here 
     return 1;          // if something is found, return 1 
    } 
    else 
    { 
     free(buffer);         // else return 0 
     free(buffer2); 
     return 0; 
    } 
} 

Si je cours avec la partie problématique décommentée je reçois un

double libération ou corruption (en haut)

erreur. Pourquoi est-ce? La mémoire ne devrait-elle pas être libérée dans la partie que la fonction retourne? Ou ai-je foiré le paramètre if et les deux instructions sont utilisées - ce que je n'espère pas, parce que le code fonctionne comme prévu autrement.

Merci de votre aide pour comprendre cette question!

+5

Après 'buffer = strstr (buffer2, mot-clé)' vous ne pouvez plus 'free (buffer)'. Peut seulement 'libérer 'la valeur' malloc' vous a donné. –

+3

En bonus, vous avez aussi fui la mémoire de 'buffer = malloc (256);' dès que vous avez fait 'buffer = strstr (buffer2, keyword))'. En regardant ce code, * aucun * ne semble justifié. Vous enveloppez effectivement 'strstr' avec un tas de gestion de mémoire inutile qui n'est pas nécessaire. * Tout * de ceci devrait être simplement remplaçable, 'return strstr (chkstring, mot-clé)! = NULL;' – WhozCraig

Répondre

3

Vérifiez la valeur de retour de strstr.

Valeur de retour

Un pointeur sur la première occurrence dans str1 de la totalité de la séquence de caractères spécifiée dans str2, ou un pointeur null si la séquence ne sont pas présents dans str1

Ce moyen que si str2 se trouve dans str1 que cela retournera l'adresse de cet emplacement.

Et lorsque vous free(buffer) vous libérez réellement str1 au lieu de la mémoire allouée précédemment.

Aussi, vous n'avez pas besoin buffer = malloc(256);

EDIT: Comme l'ont souligné d'autres, vous ne avez pas besoin des tampons

int check_string(char *chkstring, char *keyword) 
{ 
    //No need for buffers. Simply check in original string and return accordingly 

    if(strstr(chkstring,keyword) != NULL)  // Check for first appearance of keyword in chkstring 
    { 
     return 1;          // if something is found, return 1 
    } 
    else 
    { 
     return 0; 
    } 
} 

chose semblable peut être réalisé en seulement 1 ligne

return (strstr(chkstring,keyword) != NULL) 
//But then why do you need function if you only want if string exists or not. 
+0

Par le commentaire de @WhozCraig, vous pouvez réduire le contenu de 'check_string' à une seule déclaration de retour incluant l'inégalité. (mais avec le 'si 'inclus, il peut être plus lisible pour ceux nouveaux à C) –