Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3000 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Petit probleme de compréhension avec realloc...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Petit probleme de compréhension avec realloc...

n°497756
neo9205
Posté le 25-08-2003 à 22:15:53  profilanswer
 

: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++;
 
 
}
}

mood
Publicité
Posté le 25-08-2003 à 22:15:53  profilanswer
 

n°497784
Taz
bisounours-codeur
Posté le 25-08-2003 à 22:23:34  profilanswer
 

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

n°497794
Kristoph
Posté le 25-08-2003 à 22:27:10  profilanswer
 

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

n°497800
neo9205
Posté le 25-08-2003 à 22:31:41  profilanswer
 

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

n°497803
bjone
Insert booze to continue
Posté le 25-08-2003 à 22:34:13  profilanswer
 
n°497807
neo9205
Posté le 25-08-2003 à 22:35:44  profilanswer
 
n°497814
bjone
Insert booze to continue
Posté le 25-08-2003 à 22:38:40  profilanswer
 

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 ?

n°497817
SquiZZ
Posté le 25-08-2003 à 22:39:58  profilanswer
 

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
n°497820
bjone
Insert booze to continue
Posté le 25-08-2003 à 22:40:48  profilanswer
 

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
n°497822
neo9205
Posté le 25-08-2003 à 22:42:18  profilanswer
 

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 ??

mood
Publicité
Posté le 25-08-2003 à 22:42:18  profilanswer
 

n°497827
bjone
Insert booze to continue
Posté le 25-08-2003 à 22:45:22  profilanswer
 

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
n°497831
neo9205
Posté le 25-08-2003 à 22:49:23  profilanswer
 

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...

n°497841
SquiZZ
Posté le 25-08-2003 à 22:58:12  profilanswer
 

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( ...


n°497847
Taz
bisounours-codeur
Posté le 25-08-2003 à 23:01:51  profilanswer
 

les cast inutiles, c'est mal

n°497868
SquiZZ
Posté le 25-08-2003 à 23:20:37  profilanswer
 

Taz a écrit :

les cast inutiles, c'est mal


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

n°497908
Taz
bisounours-codeur
Posté le 25-08-2003 à 23:44:56  profilanswer
 

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

n°497933
SquiZZ
Posté le 26-08-2003 à 00:08:48  profilanswer
 

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.

n°497935
Taz
bisounours-codeur
Posté le 26-08-2003 à 00:11:38  profilanswer
 

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

n°497939
SquiZZ
Posté le 26-08-2003 à 00:20:28  profilanswer
 

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
n°497941
Taz
bisounours-codeur
Posté le 26-08-2003 à 00:26:30  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Petit probleme de compréhension avec realloc...

 

Sujets relatifs
[PLSQL] problème dans un script dynamiqueProbleme d'importation de classe
[JS]verification de formulaire petit pb[PHP/MySQL] Probleme de guillemets : A L'AIDE !!
[CSS] probleme de couleurs resoluPetit problème avec une CSS...
[ MySql ] Problème "Table inexistante" ou "Champs pas dans field list"Problème avec boucle [résolu]
[HTML/JS] Besoin d'aide xhtml/css : probleme avec IE 
Plus de sujets relatifs à : Petit probleme de compréhension avec realloc...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR