2011-11-16 3 views
0

ÉDITÉsizeof() d'un tableau de structure imbriquée

#include<stdio.h> 
typedef struct ns{ 
int sd; 
int we; 
char st; 
int m; 
}ds; 
typedef struct numb 
{ 
    char b; 
    ds rt; 
}num; 
static num a[]={1,'a'}; 
int read(int number) 
{ 
printf("%d\n",number); 
return 1; 
} 
int main() 
{ 
    printf("%d",sizeof(a[0].rt)); 
    read(sizeof(a[0].rt)); 
    read(sizeof(a[0])); 
    return 0; 
} 

Mon doute est sizeof d'un tableau lorsqu'il est passé en tant que paramètre sera modifié comme variable de pointeur temporaire. Mais ici dans le tableau des structures ainsi que dans le tableau de la structure imbriquée en essayant d'imprimer le sizeof il donne la taille réelle. pourquoi la seconde lecture qui contient un tableau de structures n'est pas convertie en pointeurs comme son tableau.

+1

Que voulez-vous dire par «taille de sortie à grande taille»? –

+3

Non, la taille est exacte. Vous devez juste ajuster vos attentes. –

+1

Quelle taille comptez-vous imprimer? Quel résultat obtenez-vous? Quelle est votre plateforme? – mizo

Répondre

3

Votre question n'est pas tout à fait claire. Quoi qu'il en soit, tout d'abord, lorsque les tableaux sont implicitement convertis en pointeurs, c'est la conversion array-to-pointer standard qui en est responsable. La conversion de tableau à pointeur est implicitement appliquée dans certains contextes, mais pas dans tous les contextes. Par exemple, la conversion tableau à point n'est pas appliquée aux opérandes sizeof, ce qui explique pourquoi sizeof (lorsqu'il est utilisé avec un tableau), évalue correctement la taille du tableau (pas la taille du pointeur).

Deuxièmement, a[0] n'est pas un tableau. a est un tableau. a[0] est un objet num, qui n'est pas un tableau du tout. Donc, pourquoi vous vous attendez a[0] à être converti en un pointeur n'est pas totalement clair pour moi.

+0

Merci andrey. Mon doute est de savoir si une conversion de tableau en pointeur a lieu lors du calcul de la taille d'un tableau passé en paramètre. – Angus

+0

@Angus: Cela dépend de ce que vous entendez par "tableau passé en paramètre". Il existe différentes manières de transmettre un tableau en tant que paramètre. Dans tous les cas, dans votre exemple de code, aucun tableau n'est transmis en tant que paramètre. – AnT

1

Vous exécutez probablement une optimisation que la plupart des compilateurs 32 bits et 64 bits effectueront pour aligner les éléments dans la structure. En règle générale, chaque élément sera rempli à la taille du mot système (probablement 32 ou 64 bits sur un ordinateur de bureau, 8/16 possible sur mcu intégré). Ceci permet aux systèmes de ne pas avoir à traiter de pointeurs vers des données non alignées, ce qui constitue généralement un travail supplémentaire pour le système. Vous pouvez généralement forcer le compilateur à "emballer" vos structures pour qu'elles n'utilisent que le minimum d'espace, mais vous échangez essentiellement quelques octets de RAM pour quelques octets supplémentaires d'espace de code et une exécution peut-être légèrement plus lente . Cela peut avoir du sens sur un système RAM limité ou sur des données de sérialisation pour un protocole de communication.

Notez également que la méthode d'empaquetage d'une structure varie énormément d'un compilateur à l'autre, donc ne vous attendez pas à ce qu'elle compile partout sans un gros travail de macros.

Dans GCC, la façon de "pack" est un struct comme tel:

typedef struct __attribute__ ((__packed__)) 
{ 
    int a; 
    char b; 
    long long c; 
    short d; 
} PackedStruct; 
+0

Une raison pour le vote vers le bas? – shenles

Questions connexes