|
|
|
|
Slt tt le monde
jai un probleme c'set que je veux retourner plusieurs valeurs par une fonction et j'arrive pos a reussir,je sais ke peut etre je dois utiliser un tableau(plutoto pointeur)mais quand jexecute le programme il me retourne juste la premier valeur du tableau voila un ptit exemple
#include<stdio.h>
#include<stdlib.h>
int test()
{
int *p;
p=malloc(4*sizeof(int));
*(p+0)=1;
*(p+1)=2;
*(p+2)=3;
*(p+3)=4;
return *p;
}
main()
{
int *tab,i;
tab=malloc(4*sizeof(int));
*tab=test();
for(i=0;i<4;i++)
printf("%d \n",*(tab+i));
}
voila ce programme me donne juste la premier valeur du tableau(la valeur 1)et pour les autres valeurs il me donne des adraisses.
svp jai besoin d'aide merci de maider
Configuration: Windows XP Firefox 2.0.0.11
Ton programme corrigé :
#include <stdio.h>
#include <stdlib.h>
int *test(){
int *p;
p = malloc(4*sizeof(int));
p[0] = 1;
p[1] = 2;
p[2] = 3;
p[3] = 4;
return p;
}
int main(){
int *tab;
int i;
tab = malloc(4*sizeof(int));
tab = test();
for(i=0;i<4;i++) printf("%d\n",tab[i]);
free(tab);
return 0;
}
Bonne chance |
Salut.
void* fct()
{
void *p;
p=malloc(sizeof(int)+sizeof(double));
*(int*)p=3;
*(double*)((int*)p+1)=3.002;
return p;
}
-> 3h, j'ai rien compris à ton problème.
Salutation ! Quand on sait pas, on touche pas !JBT Char Snipeur |
Voici un autre exemple, avec une structure pour exemple :
void* fct()
{
void *p;
p=malloc(sizeof(int)*2+sizeof(double));
*(int*)p=3;
*(int*)(long(p)+sizeof(int))=5;
*(double*)(long(p)+2*sizeof(int))=3.002;
return p;
}
int main()
{
void *a;//=malloc(sizeof(int)+sizeof(double));
struct lastruct {int a;int c;double b;} *ess;
a=fct();
printf("a1 %d a2 %f\n",*(int*)a,*(double*)(long(a)+2*sizeof(int)));
ess=(lastruct*)fct();
printf("a1 %d a2 %e\n",ess->a,ess->b);
scanf("%d",a);
return 0;
}
Mais il faut faire attention à ce type de manipulation, car ça dépend de l'implémentation du compilateur utiliser. En particulier, les structures sont régies par un alignement des données assez complexe. Par exemple, si j'enleve la variable c de lastruct, la structure aura toujours la même taille en mémoire, le compilateur (gcc) créeant un espace vide entre a et b. Salutation ! Quand on sait pas, on touche pas !JBT Char Snipeur |
Salut à tous,
|
Oui et non.
|
Merci à tous les deux pour vos réponses.
|
Pour la première solution,dans notre cas, comment peut on libérer p tout en voulant le retourner ?
|
Oui c'est ça. À la sortie de test la variable locale p est désallouée (mais ce n'est qu'une adresse, et ça ne désalloue pas l'espace mémoire qu'elle pointe). Comme je retourne l'adresse dans ma fonction, je récupère dans main cette adresse. Une fois que je n'ai plus besoin de ce bloc mémoire je peux le désallouer avec un free.
|