Matt67 >> Personnellement, je ne recommandrais pas d'allouer la mémoire dans la fonction même. On peut oublier de libérer comme ça. Aussi, rien n'est garanti qu'on n'utilise pas la zone mémoire avant d'utiliser la fonction. Deplus, c'est une allocation dynamique donc plus couteuse en temps processeur que de faire une "allocation statique" (un tableau).
SAKingdom : [../..] On peut oublier de libérer. [../..]
Matt : Il faut savoir ce qu'on fait.
SAKingdom : [../..] Aussi, rien n'est garanti qu'on n'utilise pas la zone mémoire avant d'utiliser la fonction [../..]
Matt : J'ai pas compris ?
SAKingdom : [../..] Deplus, c'est une allocation dynamique donc plus couteuse en temps processeur que de faire une "allocation statique" [../..]
Matt : oui mais c'est dynamique !!!
SAKingdom : [../..] Deplus, c'est une allocation dynamique donc plus
couteuse en temps processeur que de faire une "allocation statique"
[../..]
Matt : oui mais c'est dynamique !!!
Errrm. J'espère que tu n'espère pas me convincre avec ça ? ;)
Pour si peux (20 octets), mieu vaut un tableau.
SAKingdom : [../..] Aussi, rien n'est garanti qu'on n'utilise pas la zone mémoire avant d'utiliser la fonction [../..]
Matt : J'ai pas compris ?
On ne sais pas si il souhaite ou non utiliser cette zone mémoire avant d'utiliser la fonction. Si c'est le cas, la mémoire devra être allouée avant la fonction.
Je rejoints SAKingdom sur tous les points discutés plus haut:
Une allocation dynamique ne sert à rien quand on connait la taille de la zone à réserver (dans les deux cas, pour changer la taille il faut recompiler, donc l'argument de modification de taille ne tient pas).
Je pense aussi que c'est dangereux d'allouer dans une fonction et de laisser l'appelant libérer la mémoire. Les seules fonctions retournant de la mémoire à libérer sont justement les fonctions d'allocation de mémoire.
Aussi, imaginons qu'on veuille appeler beaucoup de fois la fonction. Avec l'allocation locale, on aura autant d'allocations que d'appels, alors que si c'est l'appelant qui gère ca, il peut choisir d'utiliser la même mémoire pour tous les appels.
Ok, allouer de la memoire dynamiquement pour une chaine de caractere dont on connait la taille c'est inutile...
Mais dans une fonction ou tu recuperes le texte d'un fichier texte (par exemple) ou tu recuperes des donnees dans un tableau de structures, tu es bien obligé d'allouer de la memoire dans ta fonction et de la liberer en dehors...
Si tu veux aller par la, la fonction qui lit dans le fichier ne sait pas non plus au début combien allouer. Si elle le sait, elle peut le dire à l'appelant, comme ceci par exemple:
int lireFichier(STRUCTURE* tableau)
{
if(!tableau) return tailleSouhaitée;
...
}
int taille = lireFichier(0);
STRUCTURE* s = malloc(taille * sizeof STRUCTURE);
lireFichier(s);
...
free(s);
Si tu veux, mais voila un cas (very light) dans lequel j'utilise ce que je "defends"
/* aucun control d'erreur */
int getData(MYSQL pMysql, struct data *pMydata, int *nbElement)
{
char *requete = "SELECT * FROM table";
MYSQL_RES *pRes = NULL;
MYSQL_ROW row;
unsigned long nbRecord = 0;
int i = 0;