web-dev-qa-db-fra.com

conversion invalide de `void * 'en` char *' lors de l'utilisation de malloc?

J'ai des problèmes avec le code ci-dessous avec l'erreur sur la ligne 5:

erreur: conversion non valide de void* à char*

J'utilise g ++ avec des blocs de code et j'ai essayé de compiler ce fichier en tant que fichier cpp. Est-ce que ça importe?

#include <openssl/crypto.h>
int main()
{
    char *foo = malloc(1);
    if (!foo) {
        printf("malloc()");
        exit(1);
    }
    OPENSSL_cleanse(foo, 1);
    printf("cleaned one byte\n");
    OPENSSL_cleanse(foo, 0);
    printf("cleaned zero bytes\n");
}
54
pandoragami

En C++, vous devez transtyper le retour de malloc()

char *foo = (char*)malloc(1);
104
karlphillip

C++ est conçu pour être plus sûr pour le type que C, donc vous ne pouvez pas (automatiquement) convertir fromvoid*to un autre type de pointeur. Puisque votre fichier est un .cpp, votre compilateur attend du code C++ et, comme mentionné précédemment, votre appel à malloc ne se compilera pas puisque vous assignez un char* à un void*.

Si vous changez votre fichier en .c alors il attendra du code C. En C, vous n'avez pas besoin de spécifier de transtypage entre void* et un autre type de pointeur. Si vous changez votre fichier en .c il sera compilé avec succès.

23
Marlon

Je suppose que c'est la ligne avec malloc. Il suffit ensuite de lancer le résultat - char *foo = (char*)...

7
viraptor

Alors, quelle était votre intention? Essayez-vous d'écrire un programme C ou un programme C++?

Si vous avez besoin d'un programme C, ne le compilez pas en C++, c'est-à-dire ne donnez pas l'extension ".cpp" à votre fichier ou ne demandez pas explicitement au compilateur de traiter votre fichier en C. En langage C, vous ne devez pas transtyper le résultat de malloc. Je suppose que c'est ce dont vous avez besoin depuis que vous avez marqué votre question comme [C].

Si vous avez besoin d'un programme C++ qui utilise malloc, vous n'avez pas d'autre choix que de convertir explicitement la valeur de retour de malloc dans le type approprié.

5
AnT