3 votes

Structs, typedef et malloc, calloc

Je veux créer et utiliser quelque chose comme :

struct mystruct { 
    mystruct * AnOtherMyStruct; //mystruct must have a pointer to an other mystruct inside
    ...some stuffs...  
};

Dois-je utiliser "typedef struct" ou non ? Quels sont les avantages et les inconvénients ?

Lorsque j'alloue de la mémoire, certains m'ont dit que calloc est meilleur que malloc car il fait le même travail mais mieux...

Mes résultats seront quelque chose comme :

struct (or typedef struct) mystruct  {
    mystruct * AnOtherMyStruct;
    ...
};
int main () {

malloc or calloc =...
free(...);

À votre avis, quel est le meilleur choix pour allouer et désallouer les structs, étant donné que ces opérations seront effectuées assez fréquemment ?

3voto

Raildex Points 1410

calloc() y malloc() sont presque les mêmes.

calloc() initialise la mémoire revendiquée avec 0 s.

quand vous appelez malloc() et que vous essayez d'accéder aux membres du type alloué, vous verrez des valeurs inutiles (pour les int par exemple, vous verrez des valeurs comme 347289472 ) alors qu'avec calloc() vous verrez des 0 comme valeurs initiales

3voto

Lundin Points 21616

Dois-je utiliser "typedef struct" ou non ? Quels sont les avantages et les inconvénients ?

C'est juste un style de codage subjectif. Le style le plus courant est d'utiliser un typedef. L'avantage est que cela permet au code de se comporter comme en C++. Le typage struct name explicite est également acceptable, un style privilégié par Linux. Aucun style n'est manifestement bon ou mauvais.

Cependant, pour les structures auto-référencées, quel que soit le style, vous devez toujours écrire le membre pointeur avec la balise struct la notation.

typedef struct foo
{
  struct foo* next;
} foo_t;

foo_t* next ne fonctionnera pas car le typage n'est pas complet à ce moment-là. foo est toutefois une "balise struct", et non un nom de type, et suit donc des règles différentes. Si vous souhaitez utiliser le nom du typedef en interne, vous devez déclarer la structure :

typedef struct foo foo_t;  // forward declaration
struct foo
{
  foo_t* next;
};

Lorsque j'alloue de la mémoire, certains m'ont dit que calloc est meilleur que malloc car il fait le même travail mais mieux...

Quand quelqu'un vous dit ça, demandez-lui comment exactement calloc pas mieux. Lors de la programmation, l'esprit critique est très important.

  • malloc alloue un morceau de mémoire mais ne l'initialise pas à des valeurs connues. Puisqu'il n'y a pas d'initialisation, malloc est plus rapide que calloc .
  • calloc alloue un morceau de mémoire, ou éventuellement un réseau de morceaux placés dans des cellules de mémoire adjacentes. Elle réinitialise toute la mémoire, ce qui signifie qu'elle a des valeurs par défaut connues. De ce fait, elle est plus lente que malloc .

Alors, qu'est-ce qui est "mieux", plus rapide ou pré-initialisé ? Cela dépend de ce que vous voulez faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X