0
votes

Comment itération à travers une structure en C en utilisant la mémoire?

Je suis très gentil avec C Lang et travaille sur un projet que j'ai été coincé. Voici mon code ci-dessous xxx

}

Je voudrais faire des choses avec la variable de pointeur PT. J'essaie d'avoir accès à l'emplacement de la mémoire du premier élément de mon structure ARR afin que je puisse passer à travers le tableau et afficher tout. Je comprends que cela pourrait être plus simple de ne pas utiliser de pointeurs dans ce cas, mais je vais utiliser ce code entre les fichiers, donc je pensais que cela faciliterait le processus plus facile sur la route.


3 commentaires

Bienvenue dans le débordement de pile. Savez-vous comment itération via un tableau d'un type primitif comme int ?


Conseil: si vous utilisez des mots capitalisés pour des types tels que personne , vous pouvez définir des noms avec des noms sensibles plus facilement (par exemple personne personne )


@Beta oui je fais et ikegami, merci pour le conseil, je garderai à l'esprit la prochaine fois que je crée une structure


4 Réponses :


0
votes

Voici quelques mises à jour qui pourraient vous rapprocher de ce que vous recherchez:

  person *pt = y[0];
  printf ("this is addr %p\n", y[0]);
  printf ("this is pt %p\n", pt);
  for (int i = 0; i < 5; i++)
    {
      person current = *pt;
      printf ("%d\n", current.age);
      printf ("%d\n", current.zipcode);

      pt += 1;
    }


0 commentaires

0
votes

Si vous demandez comment itération sur les champs d'une structure, vous ne pouvez pas faire cela. Mais puisque

Si vous demandez comment itérer sur les éléments du tableau que vous avez créé, lisez activé. P>


Si vous avez un tableau P>

person array[5] = {
   { .age = 45, .zipcode = 45035 },
   ...
};

for (person *p=array, int i=0; i<5; ++pt, ++i) {
    printf("%d\n", p->age);
    printf("%d\n", p->zipcode);
}


0 commentaires

0
votes

Vous voulez vraiment [probablement] ne voulez pas le niveau supplémentaire d'indirection. Il va améliorer mieux si vous le gardez simple

vous ne pouvez pas itérer avec int * pt . Il ne compilera même pas parce que vous utilisez un pointeur int pour interdire via un tableau de personne les pointeurs [I.e. Indirection supplémentaire].

Voici une version simplifiée. En tant que torsion, j'ai ajouté une "extrémité de table" sentinelle (par exemple une entrée avec un code postal de zéro): xxx


< p> mise à jour:

Bonjour Craig, comment allais-je ajouter à mon tableau de struct alors que je vais au lieu de savoir à l'avance, comme vous l'avez fait?

Bien que, nous aurait pu utiliser l'approche Sentinel, pour cela, il est préférable de gérer le nombre de participants et d'utiliser realloc pour agrandir le Liste.

Nous devons changer les personnes global sur un pointeur . Et, la boucle d'impression doit changer.

Voici une version simple: xxx


ce qui précède fait un realloc pour chaque addPerson appel. MALLOC / RELAYLOC Peut être un peu coûteux.

Il y a une amélioration pour utiliser une deuxième variable de comptage qui maintient la trace de la taille "allouée" contre le nombre "utilisé". éléments. Cela nous permet de réduire le nombre de realloc appels: xxx


1 commentaires

Salut Craig, comment allais-je ajouter à mon tableau de struct alors que je vais au lieu de savoir à l'avance, comme si vous avez fait?



0
votes

Tout d'abord, soyez très prudent. Si personne code> a déjà un membre qui est une taille différente de l'int, la structure peut être "rembourrée" avec des octets vides, et ce rembourrage peut être différent en fonction de l'ordre des membres dans la structure. Si vous êtes très sûr que cette structure ne changera jamais, vous pouvez déclarer un int * code> au début de votre matrice de structure et accéder aux membres individuels à l'aide du pointeur IE: P>

person peopleArray[40];
int *atribPtr = (int*)peopleArray;
for(int i=0; i < sizeof(peopleArray); i++){
    doAgeStuff(atribPtr[2*i]);
    doZipStuff(atribPtr[2*i + 1]);
}


0 commentaires