J'ai une semaine à coder une fonction void qui reçoit une structure comme le paramètre de référence et avec calloc / malloc modifier le nombre de variables de structure créées, mais j'ai une erreur dans la référence du paramètre. Remarque: je code depuis l'application Android. entrez la description de l'image ici
#include <stdio.h>
#include <stdlib.h>
struct Student{
char name[50];
int age;
int semester;
char group;
};
void ModifyVar(struct Student *St);
int main(){
struct Student *St1;
ModifyVar(&St1)
return 0;
}
void ModifyVar(struct Student *St){
int N;
printf("How many Students\nAns: ");
scanf("%d",&N);
*St = calloc(N,sizeof(Student));
}
3 Réponses :
Vous souhaitez modifier la valeur de St1 dans ModifyVar dans C , vous devez donc passer le pointeur de St1 à ModifyVar . Et St1 est un pointeur, struct Student * , il faut donc passer & St1 dont le type est struct Student ** code >. Maintenant, vous devez savoir que le prototype de ModifyVar doit être void ModifyVar (struct Student **) . De plus, je pense que vous devriez noter votre style de codage.
Oui, j'ai essayé cela, mais cela a échoué, car quand j'ai lu les valeurs à l'intérieur de la structure, le fonctionnement s'arrête mais merci pour tout
@MiguelHumberto Ensuite, vous avez fait autre chose de mal en essayant de lire les valeurs. Ce serait une question distincte.
changez ceci
#include <stdio.h>
#include <stdlib.h>
struct Student
{
char name[50];
int age;
int semester;
char group;
};
void ModifyVar(struct Student **St);
int main()
{
struct Student *St1;
ModifyVar(&St1);
free(St1);
return 0;
}
void ModifyVar(struct Student **St)
{
int N;
printf("How many Students\nAns: ");
scanf("%d",&N);
*St = calloc(N,sizeof(struct Student));
}
En
free(St1);
Ou utilisez comme ceci
if(St1==NULL)
{
printf("calloc() failed");
exit(1);
}
appelez comme ths
St1 = AllocMem();
Et vérifiez que la mémoire est allouée ou non par
struct student * AllocMem()
{
int N;
printf("How many Students\nAns: ");
scanf("%d",&N);
return (calloc(N,sizeof(struct student));
}
Et n'oubliez pas de libérer la mémoire allouée par
void ModifyVar(struct Student **St) //pointer to pointer
Je l'ai fait, mais peut-être que mon compilateur Android ne fonctionne pas
Qu'avez-vous essayé? Voir le code complet ci-dessous avez-vous changé de prototype et ajoutez le point-virgule?
void ModifyVar(struct Student *St)
Merci.
Ummm ... je l'ai fait, mais peut-être que mon compilateur Android ne fonctionne pas
Merci beaucoup mon frère, je l'ai réparé
@Miguel Humberto N'hésitez pas à accepter l'une des réponses si vous l'avez.
En général, faites simplement ceci à la place:
struct Student *St1;
ModifyVar(St1);
St1 est déjà un pointeur et vous utilisez l'adresse de l'opérateur ( & St1 ) pour obtenir à nouveau l'adresse du pointeur pas le pointeur lui-même. Vous passez donc un pointeur vers struct pointer au lieu d'un simple pointeur vers struct.
Je suis content que cela ait fonctionné. Assurez-vous de voter pour les réponses utiles et d'accepter l'une des réponses si votre problème est résolu :)
n'insérez pas d'images dans la question, insérez un vrai code de caractères pour qu'on puisse les couper-n-coller. Dans tous les cas, vous avez besoin de
struct Student ** St, deux étoiles, pas une dans ModifyVar.