Allocation dynamique de structure c

Résolu
Bonjour,

s'il vous plaît , je voudrais allouer une structure dynamiquement , mais quand essaie , sa bugg : "<< expected expression before 'personne' >>", voilà mon code , pourriez vous m'aider ,

struct identit
{
char nom[10] ;
int age;
char sexe[1];
} ;
typedef struct identit identite;

int nbredamis =0 , i;
typedef struct ident *personne;

printf(" ce programme permet d'afficher un tableau ne connaissant pas la taille au depart \n \n");
printf("combien d'amis avez vous ? ");
scanf("%d",&nbredamis);
personne = malloc(sizeof(identite) * nbredamis);
if ( personne == NULL)
{
exit(0);
}
if ( nbredamis > 1)
{
for ( i=0 ; i < nbredamis ; i++)
{
printf(" veuillez saisir le nom de l\'ami %d \n",i+1);
scanf("%s",&personne[i].nom);
printf("\n veuillez saisir l\'age de l\'ami %d \n",i+1);
scanf("%d",&personne[i].age);
printf("\n veuillez saisir le sexe de l\'ami %d \n",i+1);
scanf("%s",&personne[i].sexe);

printf("\n \n");
}
}

for ( i=0 ; i < nbredamis ; i++)
{
printf(" ami %d \n",i+1);
printf("%s\n",personne[i].nom);
printf("%d\n",personne[i].age);
printf("%s\n",personne[i].sexe);
printf("\n \n");

}

3 réponses

  1. je voulais tester ce code , mais ,sa ne passe toujours pas , pourrais tu m'aider ?

    int nbreDepersonne = 0;
    struct identite
    {
    char nom[15];
    int age;
    char prenom[20];
    };
    identite *personne;
    printf("veuiller saisir le nombre de personnes ");
    scanf("%d",&nbreDepersonne);

    personne = malloc (sizeof(identite)* nbreDepersonne)
    if (personne != NULL)
    {
    printf(" \n sa marche youpi");
    } else {
    printf(" \n sa marche pas ");
    exit(0);
    }

    // bien sur le free(...) est à bien à la suite.
    1. Contributeur
      Merci de mettre systématiquement le code entier et entre des balises "code" (à droite du bouton "souligné"). Sinon c'est illisible.
      De plus, tu dis que ça ne marche pas, mets-nous le code généré par le compilateur. Souvent, ça dit ce qui ne va pas.
      Là, je ne vois plus le typedef sur Identite... Tu l'as supprimé ?
    2. ok, tout suite
    3. Voici mon code , je ne l'ai pas encore modifier entièrement , je voudrais d'abord tester si l'allocation de la taille demandée est possible avant de continuer à coder et donner des valeurs aux différentes variables .

      #include <stdio.h>
      #include <stdlib.h>
      int main()
      {
          int nbreDepersonne = 0;
          struct identit
          {
              char *nom[15];
              int *age;
              char *prenom[20];
          };
          identit identite; //je crée la structure identite
          typedef struct identite *personne ;// je crée une structure pointeur qui va pointer sur identite
          printf("veuiller saisir le nombre de personnes ");
          scanf("%d",&nbreDepersonne);
      
          personne = malloc (sizeof(identite)* nbreDepersonne) // allocation dynamiques de nbreDePersonnes cases de type stuctures
          if (personne != NULL)
          {
              printf(" \n sa marche youpi");
      
      
          }
          else
          {
              printf(" \n sa marche pas ");
              exit(0);
          }
      
          free(personne);
         return 0;
      }
      
    4. Voici les erreurs qui me sont notifiés
      -------------- Build: Debug in chainesdecaracteresenc ---------------
      
      Compiling: main.c
      D:\chainesdecaracteresenc\main.c: In function 'main':
      D:\chainesdecaracteresenc\main.c:12: error: 'identit' undeclared (first use in this function)
      D:\chainesdecaracteresenc\main.c:12: error: (Each undeclared identifier is reported only once
      D:\chainesdecaracteresenc\main.c:12: error: for each function it appears in.)
      D:\chainesdecaracteresenc\main.c:12: error: expected ';' before 'identite'
      D:\chainesdecaracteresenc\main.c:17: error: expected identifier or '(' before '=' token
      D:\chainesdecaracteresenc\main.c:24: error: 'else' without a previous 'if'
      D:\chainesdecaracteresenc\main.c:30: error: expected expression before 'personne'
      Process terminated with status 1 (0 minutes, 0 seconds)
      7 errors, 0 warnings
      
    5. Contributeur
      Salut yaorens,

      Pour tes erreurs de compilation, commence déjà par celle-là

      "identit" n'est pas un type, c'est une étiquette de structure

      Pour en faire un type que tu puisses utiliser dans tes déclarations de variables, fais-en un typedef.

      Comme cela :
          typedef struct
          {
              char nom[15];
              int age;
              char prenom[20];
          } IDENTIT;

      Plusieurs remarques :
      - j'ai retiré les * que tu avais mis sur nom, prenom et age. Autrement, tu déclarais des tableaux de pointeurs sur char, ou un pointeur sur int (et je crois pas que c'est ce que tu veux faire)
      - il vaut mieux identifier les types créés par l'utilisateur, visuellement IDENTIT se remarque mieux

      Cela te permet de faire :
          IDENTIT *une_personne;      /* déclaration d'un pointeur sur une 
                                         structure IDENTIT */

      Pour le reste du code... Ben tu peux faire de nombreuses façons. Si tu veux allouer directement un bloc de mémoire pour toutes les structures, il te faudra un moyen de le parcourir.

      Le pointeur "une_personne", par exemple :-)

      Dal