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 :

Allocation dynamique ne marche pas


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut Allocation dynamique ne marche pas
    Voila,
    tout est dans le titre, je ne parvient pas a comprendre pourquoi j'ai un bug
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    int i;
    	for(i=0; ((num/=10) != 0); ++i);
     
    	char *str;
    	str = malloc(sizeof(char) * i);
     
    	return str;
    Merci

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int i;
    for(i=0; ((num/=10) != 0); ++i); 
     
    char *str;
    str = malloc(sizeof(char) * i);
     
    return str;
    Bonjour,

    merci de compléter un peu, plus un problème est explicite plus il est facile à résoudre et plus la réponse sera claire.

    • num cette variable viens d'ou?
    • return : semble indiquer que tu es dans une fonction, quel est son prototype
    • Si i vaut 0 que retourne malloc(sizeof(char)*i) qui équivaut à malloc(0)?
    • quand libère tu la mémoire alloué par malloc?

  3. #3
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut
    En effet, je suis dans une fonction.
    num est un int passé comme argument a la fonction.
    et i ne peux pas etre egal a 0.

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par IsraGab Voir le message
    En effet, je suis dans une fonction.
    num est un int passé comme argument a la fonction.
    et i ne peux pas etre egal a 0.
    rien ne l'indique dans le bout de code que tu as donné, je ne vois pas ce qui empêche i d'être égal à 0....

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main() {
      int i = 0;
      int num = 5;
     
      printf("num/10=%d\n",num/10);
     
      for(i=0;((num/=10) != 0);++i);
     
      printf("i=%d\n",i);
     
      return EXIT_SUCCESS;
    }
    Affiche:
    je te conseille de jeter un oeil ici (notamment la partie sur la division entière):
    http://c.developpez.com/cours/bernar...gne/node21.php

  5. #5
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    rien ne l'indique dans le bout de code que tu as donné, je ne vois pas ce qui empêche i d'être égal à 0....
    num est forcement superieur a 10!
    (Je ne pensais pas que c'etait essentiel a indiquer)

  6. #6
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par IsraGab Voir le message
    num est forcement superieur a 10!
    (Je ne pensais pas que c'etait essentiel a indiquer)
    plus la description du problème est précise plus il est facile à comprendre donc à résoudre car cela évite les fausses piste.


    Des deux problèmes suivant lequel est le plus facile à résoudre?
    • x = 5 * y - 7 * z, que vaut x.
    • x = 5 * y - 7 * z, que vaut x quand y = 2 et z vaut 3.


    plusieurs chose peuvent faire planter un malloc,
    • tu demande plus que ce que le sytème peu te fournir (souvent une fuite mémoire)
    • tu passe un argument invalide


    Note aussi que malloc alloue la mémoire mais ne l'initialise pas. c'est à dire que str pointe sur un bloc de mémoire donc le contenu est non définit.

    http://rperrot.developpez.com/articles/c/allocationC/

  7. #7
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Ceci dit, si le but est de mettre un entier dans un chaine C, cas ou l'on peut avoir besoin de connaitre le nombre de digit et allouer un chaine.

    Autant allouer directement le nombre max de digit d'un entier (ça évite la boucle)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char * numToStr(int32_t num)
    {
       // -2147483648
       //  2147483647
       char * s = malloc(sizeof(char)*12);
       sprintf(s,"%d",num);
    }

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Il y a mieux, en utilisant un cas particulier de snprintf() :

    C99 autorise str à être NULL dans ce cas, et réclame en valeur de retour (comme toujours) le nombre de caractères qui auraient été écrits si la chaîne de sortie avait été assez grande
    http://man.developpez.com/man3/snprintf.3.php

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    @Bktero : C'est bon à savoir.
    Merci pour cette information, je me coucherais moins bête ce soir

    Bon je ne pense pas qu'il sera vraiment utile juste pour un entier, mais si on a un format plus complexe, c'est assez intéressant d'avoir cette méthode pour faire :
    - snprintf
    - allocation
    - sprintf

Discussions similaires

  1. realloc avec tableau dynamique ne marche pas
    Par christianf dans le forum Débuter
    Réponses: 2
    Dernier message: 27/07/2010, 14h21
  2. Allocation dynamique ou pas ?
    Par ymoreau dans le forum C++
    Réponses: 8
    Dernier message: 01/12/2007, 20h01
  3. Allocation dynamique de classe qui marche pas
    Par Guillaume602 dans le forum C++
    Réponses: 8
    Dernier message: 11/07/2006, 10h55
  4. Radio dynamique marche pas sous IE
    Par DIOnTheDole dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/05/2006, 14h32
  5. Sysdate qui marche pas ??
    Par StouffR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2002, 13h23

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