Petit probleme de compréhension avec realloc... - C - Programmation
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
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
Marsh Posté le 25-08-2003 à 22:31:41
Taz a écrit : 1) ne pas utliser gets mais fgets |
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
Marsh Posté le 25-08-2003 à 22:38:40
neo9205 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 ?
Marsh Posté le 25-08-2003 à 22:39:58
neo9205 a écrit : |
mauvais livre, changer de livre
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é
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)
Marsh Posté le 25-08-2003 à 22:42:18
BJOne a écrit : |
Ah oki je comprend merci
Je lis "Le langage C (Micro Application...)"
Avec un simple realloc tout seul c'était donc pas faisable ??
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)
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)". |
Oki parfais j'ai tout compris now, merci beaucoup
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...
Marsh Posté le 25-08-2003 à 22:58:12
neo9205 a écrit : |
si, ca permet de gérer l'ajout du premier participant, sinon tu devrais faire un test a la main genre :
Code :
|
Marsh Posté le 25-08-2003 à 23:20:37
ReplyMarsh Posté le 25-08-2003 à 23:44:56
SquiZz a écrit : |
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
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.
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
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 :
|
Marsh Posté le 26-08-2003 à 00:26:30
le void c'est une histoire à la con
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
edit: ça prete à confusion pour tout le monde je crois que ce soit l'une ecriture ou l'autre
Marsh Posté le 25-08-2003 à 22:15:53
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++;
}
}