C++: malloc : erreur: invalid conversion from ‘void*’ to ‘u_int8_t*’
J'ai eu ce problème:
invalid conversion from ‘void*’ to ‘u_int8_t*’
Quand vous faites cela:
int numBytes;
uint8_t *buffer;
buffer=malloc(numBytes); //error here, why?
ou doit-je mettre comme ça?
buffer=malloc(numBytes);
Veuillez l'expliquer.
Utilisez un pointeur intelligent de quelque sorte.
OriginalL'auteur olidev | 2010-10-24
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas implicitement converti à partir
void *
en C++ (à la différence de C à cet égard). Vous pourriez faire:mais vraiment, vous devriez être en utilisant
new
/delete
au lieu demalloc
/free
!static_cast
devoid*
, et devrait probablement si seulement parce qu'unreinterpret_cast
entraînera des gens à la panique inutilement.Ce n'est pas une situation pour reinterpret_cast<> qui vous devez réserver pour des situations très particulières où vous voulez que les gens à re-vérifier le code (en particulier lors du portage).
Vous êtes à la fois à droite, réponse mis à jour...
Que devez-vous faire si vous êtes d'appel externe C code dans un autre fichier qui utilise malloc (), mais le compilateur C++ se plaint de la non-existence en fonte. Avez-vous d'ajouter manuellement des moulages pour le code C de sorte que vous pouvez l'utiliser dans du code C++?
compiler votre code C avec un compilateur C, et de compiler votre code C++ avec un compilateur C++, puis composez le code C à partir du code C++ à l'aide d'un
extern "C"
la déclaration dans un fichier d'en-tête. Le compilateur C++ ne devrait jamais voir l'appel àmalloc
si c'est dans le code C. Si vous voulez convertir en code C, C++, de sorte que vous pouvez le compiler avec un compilateur C++, tout en continuant à utilisermalloc
alors oui, vous aurez besoin d'ajouter un cast dans le cadre de ce processus. Faire cela en même temps que de renommer les variables C nomméclass
, et toutes les autres modifications nécessaires pour la rendre valide en C++ avec le sens désiré!OriginalL'auteur Oliver Charlesworth
Malloc renvoie un pointeur void; quand vous l'utilisez, vous devez lancer la valeur de retour d'un pointeur vers quel que soit le type de données que vous stockez dans.
OriginalL'auteur Sam Dufel
En C++, il n'est pas autorisé à simplement affecter un pointeur de type d'un pointeur d'un autre type (comme toujours il y a exception à la règle. Il est par exemple valable pour affecter un pointeur vers un pointeur void.)
Ce que vous devez faire est de jeter votre vide pointeur vers un u_int8_t pointeur:
Remarque: il est uniquement nécessaire en C++, en C, il est autorisé de mélanger et assortir les pointeurs. La plupart des compilateurs C donner un avertissement, mais elle est valable code.
Puisque vous êtes à l'aide de C++ vous pouvez également utiliser les nouvelles et les supprimer comme ceci:
et de se débarrasser de votre tampon en utilisant:
En général, vous ne devriez pas utiliser malloc et free, sauf si vous avez à l'interface avec les bibliothèques c.
vector
ne fine, presque tout le temps.Et vous ne devriez pas utiliser de style c jette en c++.
OriginalL'auteur Nils Pipenbrinck