IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

utiliser strcat apres malloc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 127
    Par défaut utiliser strcat apres malloc
    Bonjour a tous

    Dans le code ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
     
    main()
    {
    	char *add="i";
    	char *chaine="rem";
    	char *copychaine=malloc(10);
     
    	if(copychaine==NULL)
    	{
    		fprintf(stderr,"\nErreur memeoire");
    		exit(EXIT_FAILURE);
    	}
     
    	strcpy(copychaine,chaine);
     
    	printf("\n%s",copychaine);
    	strcat(copychaine,add);
     
    	return 0;
     
     
    }
    Je souhaite concatener deux chaines de caracteres dont la chaine de destination a préalablement ete alloue avec malloc. Et cela pose quelques petits soucis, puisque la chaine n'est plus assez longue.

    Merci pour votre aide

    A bientôt

    Rémi

  2. #2
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par remi77
    e souhaite concatener deux chaines de caracteres dont la chaine de destination a préalablement ete alloue avec malloc. Et cela pose quelques petits soucis, puisque la chaine n'est plus assez longue.

    Merci pour votre aide

    A bientôt

    Rémi
    Elle est assez longue dans ton cas.
    Disons que tu devrais afficher ton résultat avec un printf après l'appel de ta fonction strcat pour oberver le résultat!

  3. #3
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par homeostasie
    Elle est assez longue dans ton cas.
    Disons que tu devrais afficher ton résultat avec un printf après l'appel de ta fonction strcat pour oberver le résultat!
    Et dans la mesure du possible, essaie d'utiliser strncpy et strncat de préférence à strcpy et strcat. Ca réduit justement les risques de débordement en cas de chaînes pas assez longues.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par zooro
    Et dans la mesure du possible, essaie d'utiliser strncpy et strncat de préférence à strcpy et strcat. Ca réduit justement les risques de débordement en cas de chaînes pas assez longues.
    Mauvaise idée. strncpy(), par exemple, ne fait pas ce que tu crois. Pour commencer, si la chaine est plus courte, elle complète de 0 ce qui est une perte de temps. Ensuite, si la chaine est trop longue, elle ne met pas de 0 du tout, ce qui est une catastrophe.

    De plus, ici, ce n'est absolument pas justifié, puisque la taille est mesurable a coup de strlen(). Il n'ya donc aucun risque de débordement si on écrit le code correctement.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 127
    Par défaut
    Voila je reposte le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
     
    main()
    {
    	char *add="i";
    	char *chaine="rem";
    	char *copychaine=malloc(10);
     
    	if(copychaine==NULL)
    	{
    		fprintf(stderr,"\nErreur memeoire");
    		exit(EXIT_FAILURE);
    	}
     
    	strcpy(copychaine,chaine);
     
    	strcat(copychaine,add);
    	printf("\n%s",copychaine);
     
    	return 0;
    Ce fut une petite erreur de ma part, mais le fond de ma question reste toutefois la meme, est il nécessaire de reallouer de la memoire supplémentaire avant une concatenation, si cette derniere a préalablement été alloué avec malloc?

    Merci à tous

    Rémi

  6. #6
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par remi77
    est il nécessaire de reallouer de la memoire supplémentaire avant une concatenation, si cette derniere a préalablement été alloué avec malloc?
    Non, sauf si tu sais que tu vas dépasser la taille que tu as initiallement alloué.
    -> soit comme dit dans le post de zooro, tu utilises strncpy et strncat pour éviter les débordements mais il te manquera des caractères
    -> soit tu réalloues un espace mémoire plus grand avec realloc en prenant les précautions nécessaires vis à vis de l'utiisation de cette fonction.

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Le mieux est encore de faire un malloc(strlen(add)+strlen(chaine)+1) pour le zéro terminal, et de ne pas oublier de libérer la mémoire à la fin du programme : veuillez laisser ce programme aussi propre que vous auriez souhaité le trouver en entrant
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par remi77
    le fond de ma question reste toutefois la meme, est il nécessaire de reallouer de la memoire supplémentaire avant une concatenation, si cette derniere a préalablement été alloué avec malloc?
    Oui. strcat ne va pas détecter que c'est de la mémoire allouée avec malloc et que la zone allouée ne suffit pas, allouer une zone assez grande, faire la copie puis la concaténation, libérer la zone originelle et changer toutes les autres références à cette zone par une référence à la mémoire nouvellement allouée.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par remi77
    <...> est il nécessaire de reallouer de la memoire supplémentaire avant une concatenation, si cette derniere a préalablement été alloué avec malloc?
    Si la taille est insuffisante, oui. Encore faut-il penser à gérer la taille correctement, ce qui n'est pas le cas ici. Pourquoi ne pas allouer tout de suite la bonne taille ?

    Là, tu mets 10. Pourquoi ? C'est parce que tu as 10 doigts ? Essaye 13, c'est un vrai nombre magique...

  10. #10
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Là, tu mets 10. Pourquoi ? C'est parce que tu as 10 doigts ? Essaye 13, c'est un vrai nombre magique...
    non, mets 42 ! ça c'est un vrai nombre magique !

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par zooro
    non, mets 42 ! ça c'est un vrai nombre magique !

Discussions similaires

  1. Utilisation events après une requête ajax
    Par Maxow dans le forum jQuery
    Réponses: 1
    Dernier message: 23/08/2009, 23h50
  2. Segmentation fault après malloc
    Par Nykoo dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 16/12/2007, 17h08
  3. [MySQL] Utiliser mysql_free_result après chaque requête ?
    Par mathieugamin dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/01/2007, 09h33
  4. Réponses: 2
    Dernier message: 24/12/2006, 17h33
  5. plantage de free après malloc
    Par Chewbi dans le forum C
    Réponses: 4
    Dernier message: 25/08/2006, 15h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo