2010-10-25 2 views
0

je code suivantcomment lancer d'un type à l'autre c

#include <stdio.h> 
#include<ctype.h> 

typedef struct { 
    int Type; 
    int Type2; 
}foo; 

typedef struct { 
    char cData[40]; 
}bar; 

int main() 
{ 
    bar b1; 
    strcpy(b1.cData,"11"); 
    foo *f=(struct foo *)&b1; 
    printf("Type is %d \n",f->Type); 
    return 0; 
} 

Mais je ne reçois pas la valeur de type 1 dans le pointeur de f, au lieu que je reçois la taille de cette struct particuler.

+3

14 questions et vous ne savez toujours pas comment formater le code correctement? –

+0

Vous pouvez formater votre code en mettant quatre espaces au début de chaque ligne. – detly

+0

@Ignacio Vazquez-Abrams corrigé – anish

Répondre

4

Quand je lance le code (après correction des erreurs), il imprime 12593. Ce qui est 49 * 256 + 49 - en Autrement dit, "11" est un nombre entier (ascii 1 étant 49). Donc, rien de mal avec le code pour autant que je peux voir (en dehors des hypothèses de mise en page de la mémoire a par Benoit), donc nous avons besoin de savoir ce que vous vous attendiez

#include <stdio.h> 
#include<ctype.h> 

typedef struct { 
    int Type; 
    int Type2; 
}foo; 

typedef struct { 
    char cData[40]; 
}bar; 

int main() 
{ 
    bar b1; 
    foo *f=(foo *)&b1; 
    strcpy(b1.cData,"11"); 
    printf("Type is %d \n",f->Type); 
    return 0; 
} 
+0

merci pour cette merveilleuse explication. Je ne comprenais pas pourquoi le numéro 12593 a été imprimé. Je veux quelque chose comme le numéro 1 ira dans type1 et le numéro 2 ira dans typ2 – anish

+0

"umber 1 ira dans type1 et numéro 2 ira dans typ2" - pas sûr de ce que vous voulez dire là. Modifier votre question avec un exemple de code? –

1

après la distribution

foo* f = (foo*)&b1 

vous interprétez la chaîne "11" (qui est représenté ASCII sage 0x31 0x31 binaire) et non comme la valeur 11

 +-------------+ 
f -> | 0x31 | 0x31 | 
    +-------------+ 

pas as

 +-------------+ 
f -> | 0x01 | 0x01 | 
    +-------------+ 

si vous vouliez voir 11 en caractères après le casting que vous auriez à faire quelque chose comme

strcpy(b1.cData,"\x001\x001"); 
+0

C'est pire. sizeof (int) n'est pas nécessairement sizeof (char) (ce dernier étant toujours 1), et donc si le compilateur n'optimise pas la structure, et a 4 octets ints, nous aurons le premier int avec '0x313100 ??' (moins bits significatifs aléatoires) et second int complètement aléatoire. – Benoit

0

Après l'exécution de votre apparence de la barre de struct de code comme ceci

| 0x31 | 0x31 | 38 * Rubis .... |

La conversion en foo rend l'interprétation int. Lorsque vous imprimez en hexadécimal, vous verrez un résultat similaire à:

printf("Type is %x \n",f->Type); 
Type is b7003131 
+0

"sortie semblable à ceci". bien, non, puisque c'est la valeur décimale qui sera imprimée ... –

+0

désolé, je viens de le remarquer. maintenant c'est corect :) – pejotr

+1

le troisième octet est rempli de zéros :) – Benoit

0

Votre casting foo *f=(struct foo *)&b1; est mauvais, parce que vous avez un typedef foo, pas une struct foo. Utilisez foo *f=(foo *)&b1; à la place. C'est à dire. ne l'utilisez pas du tout, car il viole la règle stricte d'alias et est un comportement indéfini.

Vous écrivez les données sous la forme d'une chaîne et vous les lisez en tant qu'int, c'est le comportement non défini suivant.

La strcpy écrit seulement 3 octets dans la structure (deux caractères et la fin \ 0). En supposant 32 bits, le quatrième octet de l'int reste indéterminé. La lecture de valeurs indéterminées est à nouveau un comportement indéfini. Quoi que vous obteniez en sortie, il n'y a pas de surprise, car tout est permis sur un comportement indéfini.

0

Vous essayez de faire pointer un pointeur sur foo (* f) vers une autre 'barre' de structure. foo ne sera pas capable de pointer vers ce type. Par conséquent, vous ne seriez pas en mesure de jeter une structure à l'autre.

Un pointeur peut pointer uniquement sur les données utilisées pour la déclaration du pointeur.

Essayez ceci:

typedef struct { 
    int Type; 
    int Type2; 
}foo; 

typedef struct { 
    char s[8]; 
}bar; 

int main() 
{ 
    bar b1; 
    strcpy(b1.s,"0x01020304"); 
    foo *f=(struct foo *)&b1; 
    printf("Type is %d \n",f->Type); 
    return 0; 
} 
Questions connexes