1
votes

comment faire une fonction void qui reçoit un pointeur struct pour modifier combien de variables struct?

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));
}

c

1 commentaires

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.


3 Réponses :


1
votes

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 ** . 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.


2 commentaires

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.



1
votes

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)        

Voir cette démo

Merci.


3 commentaires

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.



-1
votes

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.


1 commentaires

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 :)