L'Arithmétique Des Pointeurs Void
Donné un void
pointeur, si je veux faire de la void
pointer à x
octets à l'avance, comment cela va être mieux fait? Est-il un meilleur moyen que le casting pour un char
pointeur?
- J'ai posé une question plus large de la portée de ce que je suis en train de faire ici. Je voudrais savoir si il y a une meilleure façon de le faire, l'idée de la coulée de la void* pour un char qui semble comme un hack pour moi. stackoverflow.com/questions/3378090/custom-memory-manager
- aCuria j'ai partagé le sentiment. Donc les 2 questions qui existent déjà à ce sujet, que j'ai lié dans ma réponse.
- Si vous avez un surtout un programme C qui arrive juste à utiliser certaines des fonctionnalités C++, le compilateur va se plaindre de presque tous les void* dans votre programme. À mon avis, le compilateur est alors fait quelque chose de mal, pas le programmeur. Donc, une solution de contournement est nécessaire, pas une complète refonte des programmes.
Vous devez vous connecter pour publier un commentaire.
Pas (sauf d'avoir une
char *
au lieu d'unvoid *
pour commencer, de sorte que vous n'avez pas à le lancer tout).Si ce n'est pas souhaitable ou pas possible, alors le seul moyen est:
(Note: si vous faites ce genre de choses en C++, généralement il y a une bien meilleure solution. Sauf si vous êtes un expert et que vous avez déjà exclu toute autre alternative, je vous suggère de poster une nouvelle question lui demandant si il ya une meilleure façon de faire ce que vous essayez de le faire!)
Si vous avez un
void*
, vous ne savez pas que "x octets de l'avant" est une adresse valide. Vous ne savez pas que la création d'un tel pointeur de ne pas bloquer votre programme.Et c'est pourquoi il ne peut être fait avec
void*
.Vous ne pouvez effectuer pointeur de l'arithmétique sur les pointeurs dans un tableau. Et si vous avez un pointeur vers un tableau, vous savez le type de la matrice, et peut utiliser l'équivalent de type pointeur.
Si vous voulez une sorte de résumé "octet" pointeur (par exemple, si vous êtes à la mise en œuvre d'un pool de mémoire et la nécessité de point à un décalage dans un tampon de), vous devez utiliser
char*
ouunsigned char*
, pasvoid*
.Prendre un coup d'oeil à cette question, et cette question. Pour résumer, la réponse est à jeter à
char *
pour l'arithmétique à un octet.Quand on fait de l'arithmétique des pointeurs compilateur veut prendre en compte ce qu'il sait sur le type que le pointeur pointe.
Par exemple, si vous avez un
int *myint
. Ensuite, ces deux états de réellement faire la même chose:et
dans ce cas
myint+5
ne signifie pas "l'adresse de myint plus 5", mais "l'adresse de myint plus 5*sizeof(int))"Ainsi dans le cas d'un
void *
le compilateur ne peut pas faire d'hypothèses quevoid * + 5
devrait signifier. Donc, avant de vous utilisez un void*, ça vous oblige à spécifier comment vous souhaitez l'utiliser.Voici mon problème
c++ a été de ne pas me laisser faire cette
après avoir fait un type de casting que j'étais capable de le faire
Différence avec les autres personnes de répondre à cette question, il me semble que si un simple
+x
(pas de conversion) est suffisante pour accéder à l'adressex
octets à l'avance de votre pointeur void. Le compilateur peut ne pas aimer, mais au moins dans les cas que j'ai utilisé, il a travaillé. Je suis en utilisantg++
(gcc
)...Tant et aussi longtemps que vous savez ce que vous faites, pas de probs.
void
est un type incomplète, et l'arithmétique des pointeurs fonctionne uniquement pour les types définis par l'.