Petit probleme de compréhension avec realloc...

Petit probleme de compréhension avec realloc... - C - Programmation

Marsh Posté le 25-08-2003 à 22:15:53    

:hello:  
Je voudrais simplement savoir pourquoi dans le programme qui suit, on a besoin de mettre malloc et realloc ensemble (avec un "ou" entre les 2) alors que avec realloc seul on devrait s'en sortir puisqu'il peut au démarrage se comporter comme malloc(si pointeur=null) et par la suite étendre la place mémoire...
Quel est donc l'intéret de mettre les 2 ??Voici le programme provenant d'un livre :
 
char **pplist=NULL;
char buffer[128];
int i=0;
 
printf("participant numero %d:",i+1);
gets(buffer);
 
if(strcmp(buffer,"0" ))
{
 
if((pplist=(char **) realloc(pplist,(i+1)*sizeof(char *)))==NULL || (pplist[i]=(char *)malloc(strlen(buffer)+1))==NULL)
 printf("erreur d'allocation" );
 
strcpy(pplist[i],buffer);
i++;
 
 
}
}

Reply

Marsh Posté le 25-08-2003 à 22:15:53   

Reply

Marsh Posté le 25-08-2003 à 22:23:34    

1) ne pas utliser gets mais fgets
2) ça à l'air correct bien que je ne vois pas l'intéret du realloc ici
 
realloc(NULL, n) <=> malloc(n)
 
3) pour allour les 2 dimensions
ici on a un tableau de i char* eux meme alloués avec malloc. on veut redimensionner ce tableau à i+1, d'ou le realloc. ensuite, on alloue un esapce pour la chaine de caractère i+1 avec malloc

Reply

Marsh Posté le 25-08-2003 à 22:27:10    

Ce code est moche, à jeter.
 
En fait, le realloc change la taille du tableau de char *, et le malloc alloue un chaine à placer dans la nouvelle case de ce tableau.
 
Il m'a fallut plus de 5 secondes pour comprendre cette ligne donc ce code est à jeter :D

Reply

Marsh Posté le 25-08-2003 à 22:31:41    

Taz a écrit :

1) ne pas utliser gets mais fgets
2) ça à l'air correct bien que je ne vois pas l'intéret du realloc ici
 
realloc(NULL, n) <=> malloc(n)
 
3) pour allour les 2 dimensions
ici on a un tableau de i char* eux meme alloués avec malloc. on veut redimensionner ce tableau à i+1, d'ou le realloc. ensuite, on alloue un esapce pour la chaine de caractère i+1 avec malloc


 
En fait il y a une boucle dans le programme total, d'ou le fait que tu n'y vois pas d'intéret.
Mais le probleme c'est que realloc ne fonctionne pas comme malloc (à la 1ere saisie et le prog plante) quand j'enleve malloc du programme

Reply

Marsh Posté le 25-08-2003 à 22:34:13    

Reply

Marsh Posté le 25-08-2003 à 22:35:44    

Reply

Marsh Posté le 25-08-2003 à 22:38:40    

neo9205 a écrit :


 
En fait il y a une boucle dans le programme total, d'ou le fait que tu n'y vois pas d'intéret.
Mais le probleme c'est que realloc ne fonctionne pas comme malloc (à la 1ere saisie et le prog plante) quand j'enleve malloc du programme


 
non, mais il avait compris, le realloc agrandi ta liste de chaines, et le malloc alloue l'espace pour la chaine, si malloc a pas, segmentation fault il y a (puisque espace non alloué).
 
ce qu'on veux juste dire, c'est .......
 
c'est quoi le livre que tu lis ?

Reply

Marsh Posté le 25-08-2003 à 22:39:58    

neo9205 a écrit :


 
ca vient d'un livre, pas de moi...


 
mauvais livre, changer de livre  :D  
 
sinon c'est normal que ca plante si tu enlèves le malloc.
Les deux parties de ton if ne font pas la même chose.
le realloc permet d'agrandir le tableau de pointeurs sur les chaines de caractères (pplist) et la malloc alloue de la place pour la dernière chaine de caractère (pplist[i]).
 
[edit] grillé


Message édité par SquiZZ le 25-08-2003 à 22:40:25
Reply

Marsh Posté le 25-08-2003 à 22:40:48    

au fait avec le printf("erreur gna gni" ), y'a pas de return ou de exit() ? (return de préférence)


Message édité par bjone le 25-08-2003 à 22:41:31
Reply

Marsh Posté le 25-08-2003 à 22:42:18    

BJOne a écrit :


 
non, mais il avait compris, le realloc agrandi ta liste de chaines, et le malloc alloue l'espace pour la chaine, si malloc a pas, segmentation fault il y a (puisque espace non alloué).
 
ce qu'on veux juste dire, c'est .......
 
c'est quoi le livre que tu lis ?


 
Ah oki je comprend merci  :)  
Je lis "Le langage C (Micro Application...)" :D
 
Avec un simple realloc tout seul c'était donc pas faisable ??

Reply

Marsh Posté le 25-08-2003 à 22:42:18   

Reply

Marsh Posté le 25-08-2003 à 22:45:22    

non, dans la mesure où le "tableau" que tu réalloues est un tableau de "pointeurs sur char (caractères)".
 
donc quand tu agrandis, tu rajoute une entrée au "tableau de pointeurs", donc un pointeur, qui pointe sur n'importe quoi (non initialisé le pointeur).
 
il faut donc que ce pointeur soit initialisé avec malloc (qui prends en paramètre la longueur de la chaine saisie)


Message édité par bjone le 25-08-2003 à 22:45:50
Reply

Marsh Posté le 25-08-2003 à 22:49:23    

BJOne a écrit :

non, dans la mesure où le "tableau" que tu réalloues est un tableau de "pointeurs sur char (caractères)".
 
donc quand tu agrandis, tu rajoute une entrée au "tableau de pointeurs", donc un pointeur, qui pointe sur n'importe quoi (non initialisé le pointeur).
 
il faut donc que ce pointeur soit initialisé avec malloc (qui prends en paramètre la longueur de la chaine saisie)


 
Oki parfais j'ai tout compris now, merci beaucoup  :jap:  
 
Je dirais seulement que l'intéret du realloc à pouvoir fonctionner en malloc (si le pointeur de destination est null) ne sert donc pas à grand chose...

Reply

Marsh Posté le 25-08-2003 à 22:58:12    

neo9205 a écrit :


 
Oki parfais j'ai tout compris now, merci beaucoup  :jap:  
 
Je dirais seulement que l'intéret du realloc à pouvoir fonctionner en malloc (si le pointeur de destination est null) ne sert donc pas à grand chose...


 
si, ca permet de gérer l'ajout du premier participant, sinon tu devrais faire un test a la main genre :  

Code :
  1. if(pplist)
  2.   pplist=(char **)realloc(....
  3. else
  4.   pplist=(char **)malloc( ...


Reply

Marsh Posté le 25-08-2003 à 23:01:51    

les cast inutiles, c'est mal

Reply

Marsh Posté le 25-08-2003 à 23:20:37    

Taz a écrit :

les cast inutiles, c'est mal


 
Vive new/delete, a bas malloc/free.
Le C++ vaincra !
 

Reply

Marsh Posté le 25-08-2003 à 23:44:56    

SquiZz a écrit :


 
Vive new/delete, a bas malloc/free.
Le C++ vaincra !
 
 

là n'est pas la question: vous castez la ou c'est implcite par contre, y toujours 36 posts de mecs qui se plaigent que leur compilo gueule
 
en C, les transtypages truc* <-> void* sont implicites. tout cast est inutile et peut masquer des erreurs

Reply

Marsh Posté le 26-08-2003 à 00:08:48    

désolé, mais je fais du C sur des compilos antiques (cc sous system V) et il me semble qu'il aprécie pas trop le malloc sans cast.
bon, il supporte pas non plus "int main(void)" donc c'est pas une référence. Je vérifierais demain pour rigoler.

Reply

Marsh Posté le 26-08-2003 à 00:11:38    

int main(void) -> void en trop
 
pourtant le cast implicite est là depuis le début

Reply

Marsh Posté le 26-08-2003 à 00:20:28    

Taz a écrit :

int main(void) -> void en trop


 
d'après le draft ( http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/n843.htm ) non :
 


       5.1.2.2.1  Program startup
 
       [#1] The function called at program startup is  named  main.
       The  implementation declares no prototype for this function.
       It shall be defined with a return type of int  and  with  no
       parameters:
 
               int main(void) { /* ... */ }
 
       or  with  two parameters (referred to here as argc and argv,
       though any names may be used,  as  they  are  local  to  the
       function in which they are declared):
 
               int main(int argc, char *argv[]) { /* ... */ }
 
       or  equivalent;8)   or  in some other implementation-defined
       manner.


Message édité par SquiZZ le 26-08-2003 à 00:21:16
Reply

Marsh Posté le 26-08-2003 à 00:26:30    

le void c'est une histoire à la con :o  
et pi même dans le draft ils font des trucs pas tip tops
 
mais effectivement, je pensais qu'il avait suivi le commité du C++, mais ils ont laissé ce truc de merde  :o  :pfff:
 
edit: ça prete à confusion pour tout le monde je crois que ce soit l'une ecriture ou l'autre


Message édité par Taz le 26-08-2003 à 00:29:31
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed