seb2086
Messages postés96Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention 1 février 2010
-
8 mars 2007 à 11:39
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 2010
-
11 mars 2007 à 17:30
Bonjour,
J'ai une variable char a[20] que je voudrais retourner dans une fonction mais je ne sais pas comment faire.
Merci pour votre aide.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 8 mars 2007 à 22:35
luhtor >> On sait jamais.
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).
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 20103 9 mars 2007 à 21:43
Bonsoir,
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
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 10 mars 2007 à 23:34
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.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201013 11 mars 2007 à 10:41
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.
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 20103 11 mars 2007 à 12:47
Bonjour,
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...
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201013 11 mars 2007 à 14:16
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);
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 20103 11 mars 2007 à 14:49
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;