2014-05-17 2 views
1

J'ai écrit un petit programme qui semble fonctionner correctement, mais valgrind me donne une erreur bizarre quand je lance memcheck. J'ai besoin d'aide pour interpréter le code d'erreur :)C - Valgrind détecte une erreur dans ma fonction de chaîne inverse

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


int get_length(char* str){ 
    int i=0; 
    char c = str[0]; 
    while(c!='\0'){ 
    i++; 
    c=str[i]; 
    } 
    return i; 
} 

char* rev(char* str){ 
    int length = get_length(str); 
    char* x=malloc(length*sizeof(char)); 
    int i; 
    length-=1; 
    for(i=0; i<=length; i++){ 
     x[i]=str[length-i]; 
    } 
    return x; 
} 

int main(){ 
    char* s=rev("roma"); 
    printf("%s\n",s); 
    free(s); 
} 

sortie valgrind ci-dessous:

Invalid read of size 1 
==14727== at 0x4C29724: __GI_strlen (mc_replace_strmem.c:405) 
==14727== by 0x4E9907A: puts (ioputs.c:37) 
==14727== by 0x400673: main (in /home/francesco80b/Scrivania/i_a/l-04/main.o) 
==14727== Address 0x51ba044 is 0 bytes after a block of size 4 alloc'd 
==14727== at 0x4C28D84: malloc (vg_replace_malloc.c:291) 
==14727== by 0x400601: rev (in /home/francesco80b/Scrivania/i_a/l-04/main.o) 
==14727== by 0x400663: main (in /home/francesco80b/Scrivania/i_a/l-04/main.o) 
==14727== 
amor 
==14727== 
==14727== HEAP SUMMARY: 
==14727==  in use at exit: 0 bytes in 0 blocks 
==14727== total heap usage: 1 allocs, 1 frees, 4 bytes allocated 
==14727== 
==14727== All heap blocks were freed -- no leaks are possible 

J'ai aussi remarqué que, si j'utilise calloc() au lieu d'utiliser malloc(), valgrind ne détecte des erreurs du tout.

NOTE: J'ai écrit la fonction get_length() juste pour le fun, lol

Répondre

4

vous avez alloué moins de caractères que vous avez besoin:

char* x=malloc(length*sizeof(char)); 

devrait être

char* x=malloc(length+1); 

Multipliant par sizeof(char) est inutile, car la norme exige que ce soit 1. L'ajout de 1 est requis car vous avez besoin d'un caractère supplémentaire pour le terminateur null, que votre fonction ne parvient pas à ajouter. C'est pourquoi la lecture invalide se produit lorsque printf essaie d'imprimer la chaîne.

Pour résoudre ce problème, allouez length+1 et ajoutez x[length] = '\0'; avant de renvoyer x à partir de la fonction.