2017-09-07 4 views
-3

Dint trouver le lien exact de ma réponse, et poser cette question simple en termes où la fonction retourne le char *comment se fait des données est toujours présent dans le pointeur, même après avoir libéré avant de retourner la valeur

j'ai écrit le code de cette façon, afin que la fonction de concatense elle-même doit allouer & libérer la mémoire.

Quelqu'un peut-il plz aider avec les questions suivantes:

1) est la libération de la mémoire placée correctement? (J'ai couru Valgrind & trouvé aucun problème aussi)

2) Comment se fait-il que le pointeur "ptr" auquel est attribué la valeur de maintien, selon ma compréhension, si une mémoire à un ptr est libérée, alors la valeur devrait aussi être perdue ? Veuillez me corriger si je me trompe.

char * concat(char *str1, char *str2) 
{ 
    char *ptr; 
    ptr=(char*)malloc(strlen(str1)+strlen(str2)+1); //allocated+1 for NULL character as well 
    int i=0,j=0; 
    while(str1[i]!='\0') 
    { 
     ptr[j]=str1[i]; 
     printf("letter from src is %c\n",str1[i]); 
     i++; j++; 
    } 
    i=0; 
    while(str2[i]!='\0') 
    { 
     ptr[j]=str2[i]; 
     j++;i++; 
    } 
    ptr[j]='\0'; 
    cout<<ptr; 
    free(ptr); 
    return ptr; 
} 

int main() 
{ 
    char *str1="hello"; 
    char *str2="world"; 
    cout<<str1<<endl; 
    cout<<str2<<endl; 
    char *res=concat(str1,str2); 
    return 0; 
} 
+1

'cout' est C++. Pourquoi utilisez-vous 'malloc' et' free' en C++? –

+1

La fonction 'free' n'est pas nécessaire pour écraser la mémoire libérée. –

+0

'free' passer à' main'. – BLUEPIXY

Répondre

1

Valgrind ne se plaint pas parce que vous ne lisez pas res dans le principal. Si vous lisez res alors je m'attends à ce que vous obteniez des erreurs de Valgrind, et probablement des plantages dans une plus grande application.

Vous devez changer la fin de concat pour supprimer l'appel à free, à savoir,

cout<<ptr; 
    return ptr; 
} 

Aussi plutôt que de remettre les boucles écrites, vous pouvez utiliser strcat, c.-à-

ptr=(char*)malloc(strlen(str1)+strlen(str2)+1); 
strcat(ptr, str1); 
strcat(ptr, str2); 

Ensuite, en main vous pouvez utiliser votre résultat. Par exemple

int main() 
{ 
    char *str1="hello"; 
    char *str2="world"; 
    cout<<str1<<endl; 
    cout<<str2<<endl; 
    char *res=concat(str1,str2); 

    cout << "res from main: " << res << "\n"; 
    free(res); 

    return 0; 
} 
+0

Mon but était d'éviter d'utiliser la fonction intégrée, je cherchais à écrire une fonction définie par l'utilisateur appelée concat (..) .. de toute façon merci pour votre réponse – Azeez

+0

Les deux lignes de 'strcat' que je suggère seraient encore dans le corps de votre fonction de concaténation de l'utilisateur, juste qu'ils remplaceraient les 14 lignes qu'il faut pour vos boucles écrites à la main, –

1

Lorsque vous appelez ptr = malloc(/*size*/) un bloc de mémoire libre d'au moins la taille demandée vous est attribuée par le système; et l'adresse mémoire du début de ce bloc vous est renvoyée.

Lorsque vous appelez free(ptr), vous indiquez le système que vous ne voulez plus que le bloc de mémoire. Cependant, votre pointeur pointe toujours vers la même adresse mémoire après l'appel.

La mise en œuvre du free dépend du système. L'accès à la mémoire à cette adresse après que vous avez appelé free(ptr) est un comportement indéfini.

+0

Merci, donc le déplacer à la main est-il correct est-il? ou que suggérez-vous est mieux? – Azeez

+0

oui, je suggérerais aussi de changer 'char * concat (char * str1, char * str2)' en 'char * concat (const char * str1, const char * str2)' de sorte qu'il est clair que vous ne changez pas ou ne revenez pas vos chaînes d'entrée – MikeySans