2010-05-12 2 views
12

Les questions ci-dessous est une variable question d'entrevueComment pouvez-vous trouver la taille d'un type de données sans créer de variable ou de pointeur, ou en utilisant sizeof du type de données?

Q) Vous donné un type de données, disons X dans C.

L'exigence est d'obtenir la taille du type de données, sans déclarer ou variable pointeur de ce type,

Et, bien sûr, sans utiliser l'opérateur sizeof!

Je ne sais pas si cette question a déjà été posée dans SO.

Merci et salutations Maddy

+16

Si je réponds, puis-je obtenir le travail? – Oded

+0

@ Oded-je ne sais pas quoi répondre à cela.Vous ne postez pas cette question dans ce forum et obtenez les réponses pour cela, c'est mieux je suppose. – maddy

+2

Je suppose que la bonne réponse est "toujours utiliser sizeof!" –

Répondre

1

Vous pouvez typecast 0 (ou toute valeur arbitraire) au type datatype X * pour trouver la taille du type de données, comme l'exemple ci-dessous:

#include <stdio.h> 

    struct node{ 
     char c; 
     int i; 
    }; 

    int main() 
    { 
     printf("Sizeof node is: %d\n", ((char *)((struct node *)0 + 1) - (char *)((struct node *)0))); 
// substract 2 consecutive locations starting from 0 that point to type node, 
//typecast these values to char * to give the value in number of bytes. 
     return 0; 
    } 
+1

Comportement non défini. –

+0

Bravo !! super moyen de trouver la taille – eeerahul

+0

Pour développer sur le commentaire de R ..: le calcul avec des pointeurs invalides tels que 'NULL' n'est pas garanti pour fonctionner (même si vous ne tentez pas de les déréférencer) ([voir aussi la discussion sur La réponse de Frank Bollack] (http://stackoverflow.com/q/2817559#2817559) .Cela fonctionne sur beaucoup de machines courantes, mais pas toutes. – Gilles

4

Déclarez une structure avec un membre de ce type, puis utilisez offsetof pour calculer la taille?

struct outer 
{ 
    X x; 
    char after; 
}; 

offsetof(outer, after) devrait vous donner la taille (alignée) de x. Notez que je ne déclare pas une variable de ce type en soi, ni un pointeur sur le type, mais je l'inclut en tant que membre d'une déclaration de structure, où je mesure l'emplacement du membre qui le suit.

La macro offsetof peut être définie comme

#define offsetof(S, f) ((size_t)(&((S *)0)->f)) 
+4

"sans déclarer une variable ou une variable pointeur de ce type"? – tur1ng

+0

@John Källén-Pouvez-vous s'il vous plaît me donner une meilleure explication pour cela? Je ne suis pas clair avec la réponse. – maddy

+1

Je soutiens qu'ici X n'est pas utilisé une variable, car la mémoire pour X n'est pas allouée. –

16

Cela devrait faire l'affaire:

#include <stdio.h> 

typedef struct 
{ 
    int i; 
    short j; 
    char c[5]; 

} X; 

int main(void) 
{ 
    size_t size = (size_t)(((X*)0) + 1); 
    printf("%lu", (unsigned long)size); 

    return 0; 
} 

Explication des size_t size = (size_t)(((X*)0) + 1);

  • supposant un sizeof(X) renverrait 12 (0x0c) en raison de l'alignement
  • ((X*)0) fait un pointeur de tapez X pointant sur mem ory emplacement 0 (0x00000000)
  • + 1 incrémente le pointeur de la taille d'un élément de type X, de sorte pointant vers 0x0000000c
  • l'expression (size_t)() jette l'adresse, qui est donnée par l'expression (((X*)0) + 1) retour à un type intégral (size_t)

Espérons que cela donne un aperçu.

+1

En fait, le point principal dans ce site est d'expliquer comment les choses fonctionnent: La façon dont les gens apprennent n'est pas en ayant un réponse donnée à eux, c'est en l'expliquant –

+0

@Frank Bollack ... Que signifie cette ligne dans votre programme? size_t size = (size_t) (((X *) 0) + 1); – maddy

+0

@Ed: Merci de m'avoir ramené sur terre –

0
printf("%d",(int)(&x+1)-(int)&x 
+0

pour compilateur gnu et tC++ – Nadeem

Questions connexes