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 :

Problème d'allocation (malloc)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 21
    Par défaut Problème d'allocation (malloc)
    Bonjour,

    Voici l'extrait de code qui fache : :

    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
    char* substring(char* tmp, int deb, int fin){
    	const int nb = (fin - deb) + 1;
            char* temp;
            if(nb>=1)
    	          temp  = (char*)malloc(nb * sizeof(char));
            else
    	          printf("nb est <= 1\n");
     
    	if(temp ==NULL)
    		printf("Erreur : pointeur nul...");
    	int i;
     
    	for(i=0;i!=(fin-deb);i++){
    		printf("i:%d, tmp[deb+i]:%c\n",i, tmp[deb + i]);
    		temp [i]=tmp[deb + i];
    		printf("i:%d, temp[i]:%c\n",i, gnu[i]);
    	}
     
    	temp [fin - deb] = '\0';
    	printf("temp : %s\n", temp );
     
    	return temp ;
     
    }
    L'erreur que je rencontre vient de la ligne : temp [i]=tmp[deb + i];
    Sur la console mon code d'erreur qui indique le pointeur temp a NULL s'affiche également.

    J'ai recherché sur le net et malloc ne renvoi NULL que quand il n'a plus d'espace d'adressage (or ici nb = 6 dans la majorité des cas soit 6octets... et il me reste 1g de ram disponible d'après Windows).

    J'ai d'autres soucis sur des allocations de chaines de caractères dans mon programme...

    Je réalise ce programme sous Visual Studio 2005 sur un windows xp pro sp2 installé sur une WMware.

    En vous remerciant

    Voldie

  2. #2
    Invité
    Invité(e)
    Par défaut
    dit donc, je me trompe peut etre, mais ton for(), il n'itère pas une fois de trop ?

    for(i=0; i!=(fin-deb); i++)
    ca ne devrait pas etre i != (fin-deb) -1 plutot ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 21
    Par défaut
    En fait le probleme c'est que le pointeur est nul de toute façon donc il me renvoie une erreur dès la première boucle :s

    Merci

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Voici un exemple de correction:

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    char *substring_dup(char const *s, size_t debut, size_t fin)
    {
        char *ret = NULL;
     
        if (s != NULL)
        {
            size_t const len = (fin - debut) + 1;
     
            if (len > 0)
            {
                ret = malloc((len + 1) * sizeof *ret);
                if (ret != NULL)
                {
                    size_t i;
     
                    for (i = 0; i < len; i++)
                    {
                        ret[0] = 0;
                        strncat(ret, s + debut, len);
                    }
                }
            }
        }
     
        return ret;
    }
     
    int main(void)
    {
        int ret = 0;
        char const *s = "Bienvenue sur Developpez.com";
        char *dvp = substring_dup(s, 14, 23);
        if (dvp != NULL)
        {
            printf("---%s---\n", dvp);
        }
        else
        {
            ret = EXIT_FAILURE;
        }
        return ret;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 21
    Par défaut
    Merci pour ton exemple
    Mais j'aimerai surtout connaitre mon erreur en fait !

    J'ai testé ton code et il me renvoie systématiquement null...
    Pourtant ma chaine s'affiche bien juste avant l'appel de la fonction...

    Voldie

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 21
    Par défaut
    En fait tu as exactement la même erreur !

    ret = (char*)malloc((len + 1) * sizeof *ret);

    Renvoi null :p

    Un problème de compilation ?

    Voldie

    PS : je ne vois pas trop comment la fonction STR_sub_dyn () fonctionne :s

  7. #7
    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 voldie Voir le message
    Voici l'extrait de code qui fache :
    Ce code est incomplet...
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : D:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `substring':
    main.c:5: warning: implicit declaration of function `malloc'
    main.c:7: warning: implicit declaration of function `printf'
    main.c:9: error: `NULL' undeclared (first use in this function)
    main.c:9: error: (Each undeclared identifier is reported only once
    main.c:9: error: for each function it appears in.)
    main.c:16: error: `gnu' undeclared (first use in this function)
    Process terminated with status 1 (0 minutes, 0 seconds)
    4 errors, 2 warnings
    Je suppose que tu veux ceci :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <assert.h>
     
    char *substring (char const *s_ori, int deb, int fin)
    {
       char *temp = NULL;
       const int nb = (fin - deb) + 1;
       if (nb >= 1 && fin <= strlen (s_ori))
       {
          temp = malloc (nb);
          if (temp != NULL)
          {
             int i;
     
             for (i = 0; i != (fin - deb); i++)
             {
                assert (deb + i <= strlen (s_ori));
                temp[i] = s_ori[deb + i];
             }
     
             temp[fin - deb] = '\0';
          }
       }
       return temp;
    }
     
    int main (void)
    {
       char const *s = "Hello world";
     
    #if 1
       char *sub = substring (s, 1, 11); /* 11 : OK */
    #else
       char *sub = substring (s, 1, 12); /* 12 : error */
    #endif
     
       if (sub != NULL)
       {
          printf ("'%s'\n", sub);
          free (sub), sub = NULL;
       }
       else
       {
          puts ("error");
       }
       return 0;
    }
    En gros, c'est ça que tu cherches à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /* ---------------------------------------------------------------------
       STR_sub_dyn  ()
       ---------------------------------------------------------------------
       Fait une copie d'une sous chaine entre deux pointeurs
       A liberer.
       ---------------------------------------------------------------------
       E : debut
       E : fin
       --------------------------------------------------------------------- */
       char *STR_sub_dyn (char const *const pbeg
                          ,char const *const pend);
    http://emmanuel-delahaye.developpez.com/clib.htm
    Module STR

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'allocator
    Par Quark-Up dans le forum C++
    Réponses: 4
    Dernier message: 23/03/2006, 01h37
  2. Problème d'allocation mémoire
    Par cali1983 dans le forum C++
    Réponses: 10
    Dernier message: 10/03/2006, 23h23
  3. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  4. fenetre MDI - problème d'allocation
    Par say dans le forum C++Builder
    Réponses: 8
    Dernier message: 03/11/2005, 17h06
  5. Question sur les problèmes d'allocation dynamique
    Par slylafone dans le forum C++
    Réponses: 23
    Dernier message: 25/10/2004, 14h18

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