web-dev-qa-db-fra.com

Pourquoi déclarer une structure qui ne contient qu'un tableau en C?

Je suis tombé sur un code contenant les éléments suivants:

struct ABC {
    unsigned long array[MAX];
} abc;

Quand est-il judicieux d'utiliser une déclaration comme celle-ci?

130
Joe.Z

Il vous permet de passer le tableau à une fonction par valeur, ou de le renvoyer par valeur à partir d'une fonction.

Les structures peuvent être transmises par valeur, contrairement aux tableaux qui se désintègrent en un pointeur dans ces contextes.

183

Un autre avantage est qu'il résume la taille afin que vous n'ayez pas à utiliser [MAX] partout dans votre code partout où vous déclarez un tel objet. Cela pourrait également être réalisé avec

typedef char ABC[MAX];

mais alors vous avez un problème beaucoup plus important: vous devez être conscient que ABC est un type de tableau (même si vous ne pouvez pas le voir lorsque vous déclarez des variables de type ABC) ou bien vous 'Je serai piqué par le fait que ABC signifiera quelque chose de différent dans une liste d'arguments de fonction par rapport à une déclaration/définition de variable.

Un autre avantage est que la structure vous permet d'ajouter ultérieurement plus d'éléments si vous en avez besoin, sans avoir à réécrire beaucoup de code.

Vous pouvez copier une structure et renvoyer une structure à partir d'une fonction.

Vous ne pouvez pas faire cela avec un tableau - à moins qu'il ne fasse partie d'une structure!

45
Bo Persson

Vous pouvez le copier comme ceci.

struct ABC a, b;
........
a = b;

Pour un tableau, vous devez utiliser la fonction memcpy ou une boucle pour affecter chaque élément.

26
MetallicPriest

Vous pouvez utiliser struct pour créer un nouveau type de données comme string. vous pouvez définir:

struct String {
    char Char[MAX];
};

ou vous pouvez créer un List de données que vous pouvez utiliser par argument de fonctions ou le renvoyer dans vos méthodes. La structure est plus flexible qu'un tableau, car elle peut prendre en charge certains opérateurs comme = et vous pouvez y définir certaines méthodes.

J'espère que cela vous sera utile :)

11
Hossein Mobasher

Un autre avantage d'utiliser un tel struct est qu'il applique la sécurité de type partout où un tel struct est utilisé; surtout si vous avez deux types constitués de tableaux de même taille utilisés à des fins différentes, ces types vous aideront à éviter d'utiliser accidentellement un tableau de manière inappropriée.

Si vous n'encapsulez pas un tableau dans un struct, vous pouvez toujours lui déclarer un typedef: cela présente certains des avantages du struct - • le type est déclaré une fois, • la taille est automatiquement correcte, • l'intention du code devient plus claire, • et le code est plus facile à maintenir - mais vous perdez ◦ la sécurité de type stricte, ◦ la possibilité de copier et de renvoyer des valeurs du type et ◦ la possibilité d'ajouter membres plus tard sans casser le reste de votre code. Deux typedef pour les tableaux nus d'un type donné ne produisent des types différents que s'ils sont de tailles différentes. De plus, si vous utilisez le typedef sans * dans un argument de fonction, il équivaut à char *, réduisant considérablement la sécurité des caractères.

En résumé:

typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char   A_c_t[113];                   // Partial type-safety, not assignable

A_s_t          v_s(void);     // Allowed
A_c_t          v_c(void);     // Forbidden

void           s__v(A_s_t);     // Type-safe, pass by value
void           sP_v(A_s_t *);   // Type-safe
void           c__v(A_c_t);     // UNSAFE, just means char * (GRRR!)
void           cP_v(A_c_t *);   // SEMI-safe, accepts any array of 113
2
PJTraill

Une structure peut contenir des fonctions d'initialisation de tableau, de copie et de finition émulant certains des avantages des paradigmes de gestion de mémoire OOP. En fait, il est très facile d'étendre ce concept pour écrire un utilitaire de gestion de mémoire générique ( en utilisant la structure sizeof () pour savoir exactement combien d'octets sont gérés) pour gérer n'importe quelle structure définie par l'utilisateur. La plupart des bases de code de production intelligentes écrites en C les utilisent fortement et n'utilisent généralement pas de tableau à moins que sa portée soit très locale.

En fait, pour un tableau intégré dans une structure, vous pouvez faire d'autres "choses intelligentes" telles que la vérification des liens chaque fois que vous souhaitez accéder à ce tableau. Encore une fois, à moins que la portée du tableau ne soit très limitée, c'est une mauvaise idée de l'utiliser et de faire circuler des informations entre les programmes. Tôt ou tard, vous rencontrerez des insectes qui vous garderont éveillés la nuit et ruineront vos week-ends.

1
Aniket