Invalid conversion de unsigned char* char*
Voici un code -
1 int main(int argc, char *argv[])
2 {
3 signed char S, *psc;
4 unsigned char U, *pusc;
5 char C, *pc;
6
7 C = S;
8 C = U;
9
10 pc = psc;
11 pc = pusc;
12
13 return 0;
14 }
$ gcc test.cpp -o a
test.cpp: In function ‘int main(int, char**)’:
test.cpp:10:7: error: invalid conversion from ‘signed char*’ to ‘char*’ [-fpermissive]
test.cpp:11:7: error: invalid conversion from ‘unsigned char*’ to ‘char*’ [-fpermissive]
C'est compilé sur la version de gcc 4.6.3 sur Ubuntu 12.10 sur un processeur Intel 32 bits de la machine.
Considérant que char
type est unsigned char
sur x86. -
Si les devoirs sur la ligne 7 et 8 pour les non-types de pointeur sont Ok, pourquoi les erreurs sont jetés pour les types pointeur sur les lignes 10 et 11 ?
Aussi, devrait C = U
réussit sans nécessiter un plâtre?
Êtes-vous familier avec le terme de "strict alias" ?
La lecture de ce genre de choses ...
Notez également que vous pouvez le faire grâce à l'utilisation de
La lecture de ce genre de choses ...
-fpermissive
pourrait vous aider, et ignorer cette gêne. Juste de temps en temps, vous pouvez temporairement supprimer le tag de nouveau et de voir si votre compilateur trouve d'autres erreurs que celui-ci dans votre projet que vous doit s'inquiéter.Notez également que vous pouvez le faire grâce à l'utilisation de
void*
s, si vous ne voulez pas utiliser un compilateur drapeau. Par exemple void* pc;
serait de permettre que cela se produise, et déréférencer que vous avez à faire *((char*)pc)
. Alternativement, vous pouvez simplement utiliser un intermédiaire technique pour ne pas avoir à s'embêter avec la fonte (char*)pc
chaque fois que vous déréférencement, comme void* pc_; pc_ = pusc; pc = pc_;
, au détriment d'une inutile sizeof(ptr)
octets supplémentaires dans la pile.OriginalL'auteur nightlytrails | 2013-02-23
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, il est important de souligner le fait que
char
,signed char
, etunsigned char
sont tous différents types. L'article 4.10 du C++11 Norme définit les trois standard pointeur de conversions entre les pointeurs de types différents:Ce n'est pas pertinente, puisque nous n'avons pas null pointeurs de type
nulltptr_t
ici.Cela ne peut pas s'appliquer, car le type de destination n'est pas
void
. Enfin,signed char
n'est pas une classe de base dechar
, afin de ne pas même cela.Donc, implicitement, la norme pointeur de la conversion de
signed char
àchar
ne peut pas être effectuée.D'autre part, les conversions entre les valeurs de l'intégrale types sont autorisés conformément à ce qui est spécifié au Paragraphe 4.7.
char
,unsigned char
etsigned char
sont de 3 types différents. Je soupçonne que la question vient d'une idée fausse, quechar
est soitsigned char
ouunsigned char
.Vrai. J'ai édité la réponse, je vous remercie.
OriginalL'auteur Andy Prowl
C++ n'ont pas automatique pointeur de la conversion, il n'a pas d'importance ce que sont les types pointeur sur chaque côté de la mission, s'ils sont différents, vous avez besoin d'un plâtre.
OriginalL'auteur speeder
char
est un type distinct deunsigned char
etsigned char
. Il n'est garanti que pour avoir l'équivalent de la valeur de la représentation de l'un d'entre eux, mais il est encore un type distinct. Vous ne pouvez donc pas convertir soitunsigned char*
ousigned char*
àchar*
(qui est, sauf si vous utilisez unreinterpret_cast
). C++ ne permet pas de pointeur conversions entre types distincts de ce genre, parce qu'alors, on pourrait passer pour un autre.Cependant, une conversion de soit
unsigned char
ousigned char
àchar
est parfaitement bien parce qu'il implique une conversion de sa valeur.Envisager de cette façon: vous pouvez convertir un
int
à unfloat
, mais vous ne pouvez pas convertir unint*
à unfloat*
.OriginalL'auteur Joseph Mansfield
J'ai peut-être tort, mais comme dit ci-dessus, lorsque que vous avez attribué à "C = S, C = U;", C++ convertit automatiquement, un peu comme si vous n' "char x = "h"); printf("%i", x);". Cependant, les pointeurs pointent vers un emplacement spécifique dans la mémoire, et cet endroit a une taille. Ainsi, alors que la conversion sorte de juste regarde les valeurs à partir de différents angles, pointant vers les différentes valeurs peuvent impliquer la modification de la taille de la valeur qui est pointé.
OriginalL'auteur user1914745