L'impression de l'adresse d'un struct objet
J'ai un struct
comme ce
typedef struct _somestruct {
int a;
int b;
}SOMESTRUCT,*LPSOMESTRUCT;
Je suis entrain de créer un objet pour le struct
et l'impression qu'il adresse comme ceci
int main()
{
LPSOMESTRUCT val = (LPSOMESTRUCT)malloc(sizeof(SOMESTRUCT));
printf("0%x\n", val);
return 0;
}
..et je reçois cet avertissement
avertissement C4313: 'printf' : '%x' dans
chaîne de format conflits avec l'argument
1 de type 'LPSOMESTRUCT'
Donc, j'ai essayé de jeter l'adresse de int
comme ce
printf("0%x\n", static_cast<int>(val));
Mais j'obtiens cette erreur:
error C2440: 'static_cast' : ne peut pas
de convertir de 'LPSOMESTRUCT' int'
Ce qui me manque ici? Comment faire pour éviter cet avertissement?
Grâce.
OriginalL'auteur bdhar | 2010-06-14
Vous devez vous connecter pour publier un commentaire.
%x
attend un entier non signé. Ce que vous avez l'impression est un pointeur. Pour le faire correctement, normalement, vous voudrez utiliser%p
. De manière affectée être correct, qui attend un pointeur sur void, donc vous aurez besoin de la lancer:En réalité, la plupart des implémentations actuelles utiliser le même format pour tous les pointeurs, auquel cas le casting sera vide de sens. Bien sûr, étant donné que le C++ balise, la plupart du code que vous avez inclus devient pour le moins discutable (autres que les parties comme LPSOMESTRUCT, qui est contestable, peu importe). En C++, vous voulez quelque chose de plus comme:
OriginalL'auteur Jerry Coffin
Utiliser le %p spécificateur de format pour imprimer un pointeur.
OriginalL'auteur user85509
Si vous voulez jeter ensuite à l'aide de reinterpret_cast au lieu de static_cast pourrait faire l'affaire ici.
Avec printf essayez d'utiliser l' %zu au lieu de %x pour l'impression d'un pointeur parce que le pointeur est de type entier non signé (ie %zu).
Juste une autre chose, étant un programme c++ est-il une raison pour laquelle vous êtes à l'aide de malloc au lieu de neuf?
OriginalL'auteur shuttle87
Comme c'est marqué, C++, je peux juste remarquer que vous n'avez pas besoin typedefs lors de la création de structures dans cette langue:
devrait être:
Aussi, il est considéré par beaucoup comme une mauvaise pratique de créer des typedefs comme LPSOMESTRUCT qui cachent le fait qu'un type est un pointeur.
OriginalL'auteur