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 :

Malloc pour sprintf


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Par défaut Malloc pour sprintf
    Bonjour,
    j'ai regardé comment me servir d'un sprintf mais je n'arrive pas à l'utiliser correctement
    truc tout bete j'avais oublié d'allouer de la mémoire à ligne mais il n'accepte pas mon allocation
    j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main()
    {
       char* ligne;
       ligne = (char *)malloc(sizeof(char)*256);
       ligne="bonjour";
       int a=2;
       sprintf(ligne,"%d",a);
       printf("%s",ligne);
    }
    mais il me marque j'ai mal ecrit le malloc

  2. #2
    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 Sylar44 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main()
    {
       char* ligne;
       ligne = (char *)malloc(sizeof(char)*256);
       ligne="bonjour";
    Tu penses faire quoi là ? Tu crois vraiment qu'on peut copier une chaine avec = ? Avant d'utiliser des concepts un peu avancés comme l'allocation dynamique, il faut commencer par maitriser les bases du C, comme le traitement des chaines de caractères, par exemple... Relis ton livre de C.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Par défaut
    ben si je fais ca, ca marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ligne[10]="bonjour";
    c'est juste que je veux utiliser des pointeurs de caractère à la place et que ca fait longtemps que je n'ai plus fait de C

    j'ai rajouté un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(ligne,"%s %d",ligne,a);
    et là ca marche mais je veux des char* pas des tableaux de char

  4. #4
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Citation Envoyé par Sylar44 Voir le message
    et là ca marche mais je veux des char* pas des tableaux de char
    Quesque tu veut dire pas ceci ????

    mais le STRING dans C c'est pas le "char *".

    le char * est un pointeur sur un caractère !!!!!!

    et avec malloc, on alloue un zone de taille X a partir de cette addresse, ainsi, en faisant par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *p = malloc(X);
    strcpy(p, "abcd");
    printf("%c", p+1);
    il m'affiche le b.


    Pour mois un char * est un tableau aussi ............


    Donc, en resumer, un tableau de caracteres est une chaine de caracteres !!!!!!!!!!!

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par cmoibal Voir le message
    Donc, en resumer, un tableau de caracteres est une chaine de caracteres !
    Uniquement si le tableau est termine par '\0'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char arr[3] = { 'a', 'b', 'c' };
    n'est pas une chaine de caractere.

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    Uniquement si le tableau est termine par '\0'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char arr[3] = { 'a', 'b', 'c' };
    n'est pas une chaine de caractere.
    +1

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Par défaut
    en fait ce que je voulais dire c'est que ce morceau de programme appartiendra à une fonction qui a comme entrée un char*, mais je suis d'accord avec vous pour dire que c'est une sorte de tableau de caractère.

    Et finalement, j'ai trouvé la solution à mon problème, j'avais juste oublié de rajouter quelques bibliothèques

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hae,
    Citation Envoyé par Sylar44 Voir le message
    en fait ce que je voulais dire c'est que ce morceau de programme appartiendra à une fonction qui a comme entrée un char*, mais je suis d'accord avec vous pour dire que c'est une sorte de tableau de caractère.
    Ce n'est pas "une sorte de tableau de caractère", mais un pointeur vers un caractère, ou un tableau de caractères (qui est une chaîne de caractères si le dernier = 0).

    L'interprétation dépend uniquement de la fonction.

  9. #9
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Par défaut
    oui on est d'accord

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    En reprenant ton exemple,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne = (char *)malloc(sizeof(char)*256);
    tu alloues une zone mémoire de 256 char, pointée par le pointeur "ligne".

    Là, tu créées une chaîne de caractère constante, sur laquelle "ligne" pointe.

    En fait, ça provoque deux problèmes :
    1) Tu provoques une fuite de mémoire car, vu que tu as modifié la valeur du pointeur, tu ne peux plus libérer la zone mémoire effectuée par le malloc.
    2) Comme tu pointes sur une chaîne constante, tu ne peux pas la modifier.


    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ligne[10]="bonjour";
    créée un tableau de 10 caractères (terminé par \0) initialisé par "bonjour\0". Le contenu du tableau peut être modifié, mais "ligne" ne peut pas l'être.

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #include <stdio.h>
    #include <stdlib.h> /* ou malloc.h */
    int main()
    {
       char* ligne; 
       int a=2;
       ligne = (char *)malloc(256); /* sizeof(char)=1*/
       sprintf(ligne,"Bonjour %d",a);
       printf("%s",ligne);
     
       return 0;
    }
    Je crois que comme ça c'est mieux.

    Dans le cas d'un argument passé à une fonction le programme le code ne change pas sauf si l'allocation est faite avant l'appel de la fonction, là t'auras pas besoin de malloc() dans le corps de la fonction.

  12. #12
    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 sofiane80 Voir le message
    Non. pas de <malloc.h> en C standard.
    Citation Envoyé par sofiane80 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       char* ligne; 
       ...
       ligne = (char *)malloc(256);
    Pourquoi faire plus compliqué que nécessaire ? (et oublier test et libération de la mémoire...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       char* ligne = malloc(256);
       if (ligne != NULL)
       {
                    ...
          free (ligne), ligne = NULL;
       }
    ou tout simplement

Discussions similaires

  1. malloc pour un tableau 2D
    Par TANITE dans le forum Débuter
    Réponses: 8
    Dernier message: 04/06/2013, 20h51
  2. Réponses: 13
    Dernier message: 22/04/2013, 18h25
  3. malloc pour des grandes tailles mémoires
    Par SuperSeb95 dans le forum C
    Réponses: 9
    Dernier message: 21/05/2012, 14h40
  4. Fonction malloc pour allocation
    Par Maria1505 dans le forum C
    Réponses: 6
    Dernier message: 06/11/2006, 16h38
  5. Réponses: 4
    Dernier message: 21/03/2006, 04h55

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