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

Bibliothèque standard C Discussion :

Probleme de realloc pour un tableau 2D


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut Probleme de realloc pour un tableau 2D
    Bonjour à tous,

    Désolé de déranger pendant les périodes de vacances de noel, mais les erreurs C ne prennent pas de vacances !

    Je travaille sur un projet qui doit lire un fichier XML pour sa configuration. De ce coté là, pas de problème, mais ... je ne sais pas d'avance combien de structure du type

    <client>
    <id>IDENTIFIANT</id>
    <ip>@IP</ip>
    </client>



    peuvent se trouver dans ce fichier de configuration, et je passe donc par un realloc pour gérer cela de façon dynamique.

    Le gros problème, c'est que la LibC GNU n'est pas contente, elle m'insulte avec un classique "invalid next size".

    Pour simplifier le code et juste résoudre le problème, j'ai écrit cela :

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
     
    typedef struct client{
    	char ip[32];
    	char id[128];
    } client;
     
    int main(int argc, char **argv) {
     
    	client **test;
    	client **temp;
    	int i = 0;
     
    	int orig = 2;
    	int new = orig*2;
     
    	test = (client **) malloc(sizeof(client *)*orig);
     
    	for(i=0;i<orig;i++){
    		test[i] = (client *)malloc(sizeof(client));
    	}
     
    	fprintf(stdout,"Reallocation de %i vers %i :\n\n",orig,new);
     
    	int u = 0;
     
    	while(u++<5){
     
    		strcpy(test[0]->ip,"TEST");
     
    		fprintf(stdout,"TEST(0) == %s\n",test[0]->ip);
     
    		if((temp = realloc(test,sizeof(client *)*new)) == NULL){
    			fprintf(stderr,"Erreur avec le realloc : %s\n",strerror(errno));
    			return(-1);
    		}
    		test = temp;
     
    		fprintf(stdout,"REALLOC EFFECTUE :: TEST(0) == %s\n",test[0]->ip);
     
    		new = orig*2;
     
    		for(i=orig;i<new;i++){
    			test[i] = (client *)malloc(sizeof(client));
    			orig = new;
    		}
     
    		strcpy(test[1]->ip,"TEST2");
     
    	}
     
    	fprintf(stdout,"TEST(1) == %s\n",test[1]->ip);
    	fprintf(stdout,"TEST(0) == %s\n",test[0]->ip);
     
     
    	i=0;
     
    	while(*test!=NULL){
    		fprintf(stdout,"%i => %s\n",++i,(*test)->ip);
    		test++;
    	}
     
    	return (0);
    }


    Ce code ne sert vraiment à rien, ormis allouer de la mémoire, mais il met en pratique ce que je dois faire : faire une boucle de reallocation de mémoire.

    J'ai en vain essayé de passer par des client*** comme j'avais pu le voir sur d'autres forum :
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    client **tableau;
    client ***temp = realloc(&tableau,NEW_SIZE);
    [...] // TESTS
    tableau = *temp;


    Je commence à être désespéré, please HELP !!

    Merci d'avance et bonnes fêtes à tous

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le
    est mal placé :

    - Entrée dans la boucle : orig = 2 new = 4, réallocation de 4, new prend la valeur 4, des clients sont alloués pour un indice de 2 à 4, puis orig = new = 4. OK, mais

    - Boucle suivante : orig = new = 4, réallocation de 4 (au lieu de 8 !), new prend la valeur 8, des clients sont alloués pour un indice de 4 à 8 et leur adresse placée dans une zone qui n'a pas été allouée !!!!!

    Le code suivant, basé sur le tien, permet de constater toutes les allocations
    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
    int main(int argc, char **argv)
    {
      client **test;
      client **temp;
      int i;
      int u;
      int orig = 2;
      int new ;
     
      test = malloc(sizeof(client *)*orig);
      for(i=0;i<orig;i++)
         test[i] = malloc(sizeof(client));
      strcpy(test[0]->ip,"TEST0");
      strcpy(test[1]->ip,"TEST1");
     
      for(u=0;u<5;u++)
      {
         new = orig*2;   // Doit être placé AVANT le realloc
         if((temp = realloc(test,sizeof(client *)*new)) == NULL)
         {
            fprintf(stderr,"Erreur avec le realloc : %s\n",strerror(errno));
            return(-1);
         }
        test = temp;
        fprintf(stdout,"Reallocation de %i vers %i\n",orig,new);
        for(i=orig;i<new;i++)
        {
           test[i] = malloc(sizeof(client));
           sprintf(test[i]->ip,"Test%d",i);
        }
        orig = new;
      }
      for(i=0;i< orig;i++)
        fprintf(stdout,"%i => %s\n",i,test[i]->ip);
      return 0;
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut Merci
    Tout fonctionne bien maintenant ...

    Merci vraiment du temps que vous avez pu passez à me répondre

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

Discussions similaires

  1. Probleme pour classer tableau via Icomparer
    Par JerryOne3 dans le forum C#
    Réponses: 2
    Dernier message: 26/02/2009, 19h18
  2. Probleme de realloc sur un tableau 2d.
    Par gnouz dans le forum C
    Réponses: 9
    Dernier message: 08/06/2007, 13h35
  3. probleme avec IE pour alignement en haut dans un tableau
    Par italiasky dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 05/02/2007, 12h48
  4. probleme de script pour trier dynamiquement un tableau
    Par K_!!! dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/02/2006, 16h46
  5. [MySQL] Probleme d'exploitation d'une vue (VIEW) pour un tableau
    Par nico4731 dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 03/02/2006, 14h26

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