Estoy teniendo problemas con el código de abajo con el error en la línea 5:

de error: invalid conversión de void* a char*

Estoy usando g++ con codeblocks y traté de compilar este archivo como un archivo cpp. ¿Importa?

#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");
}
  • Sí, lo que importa. Consulte david.tribble.com/text/cdiffs.htm#C99-void-ptr .
  • Lo siento de antemano para gritar, pero NO se puede COMPILAR C COMO C++. Ellos no son el mismo idioma.
  • Esta pregunta está etiquetada tanto c y c++. Escoja una, por favor, a continuación, retire la otra etiqueta.
InformationsquelleAutor pandoragami | 2011-02-24

4 Comentarios

  1. 104

    En C++, usted necesita para lanzar el retorno de malloc()

    char *foo = (char*)malloc(1);
    • En C++ que haces, no en C.
    • Si usted está escribiendo un código en C (y), entonces el uso de la .c extensión para el nombre de archivo y vas a ser bueno.
    • gracias a la gente que me voy a revisar esto como la respuesta en 12 minutos.
    • Si estás usando C++, por favor, no la etiqueta que [c]. Tu no eres el mismo, ya que esta respuesta indica claramente.
    • Si usted va a voto, por favor explique por qué.
    • La gente se olvida de que el tipo se guarda su nombre de archivo .cpp, por lo tanto mi respuesta es totalmente relevante.
    • Sólo quería señalar que muchas personas prefieren el reparto debe ser explícita, incluso en C como una cuestión de estilo, especialmente en grupos de trabajo con programadores que cambiar mucho entre C y C++.
    • Bielefeldt, pero es la cosa incorrecta a hacer en C si se va a hacer como una cuestión de estilo. No incluyendo stdlib.h causaría malloc a ser definidas implícitamente devolver un int. Este se muestran los errores si el yeso está implícito entre int y algunos puntero, pero no se muestran los errores si no hay una conversión explícita al tipo correcto. Sin duda es el mejor estilo para utilizar la más segura forma de C?
    • en qué compilador es esto seguro? En gcc 4.5.2 puedo obtener exactamente la misma advertencia cuando la omisión de stdlib.h de cualquier manera. Conversiones implícitas son los más notorios para el compilador de «ayudar» en formas inesperadas, que es por qué C++ se deshizo de muchos de ellos y se añade el explicit palabra clave que le permite desactivar los demás.
    • poner un -fno-builtin bandera en GCC para deshabilitar el GCC builtin malloc (que hace un montón de extra controles internos). Si tiene la mala suerte de estar en un sistema con ints un ancho diferente de los punteros, en cuyo caso el código con el elenco todavía le dará una advertencia, pero será imprevistos. (Me pongo de prueba.c:2: advertencia: fundición a puntero de enteros de tamaño diferente). Si tienes suerte, el código con la conversión explícita se compila bien, mientras que el código sin que te de error.
    • De hecho, en C++ se debe no uso malloc pero new

  2. 23

    C++ está diseñado para ser más seguro del tipo de C, por lo tanto, usted no puede (automáticamente) convertir de void* a otro tipo de puntero. Dado que el archivo es un .cpp, el compilador está a la espera de código C++ y, como se mencionó anteriormente, su llamada a malloc no va a compilar desde su asignar un char* a un void*.

    Si cambia el archivo a una .c, a continuación, va a esperar C código. En C, no es necesario especificar un reparto entre void* y otro tipo de puntero. Si cambia el archivo a una .c que se compilará correctamente.

  3. 7

    Yo asumo que esta es la línea con malloc. Acaba de lanzar el resultado entonces char *foo = (char*)...

  4. 5

    Así que, ¿cuál era su intención? Estás tratando de escribir un programa en C o C++ programa?

    Si usted necesita un programa en C, entonces no se compile como C++, es decir, no dar su archivo «.cpp» extensión o se pide explícitamente que el compilador para tratar el archivo como C. En lenguaje C no debe emitir el resultado de malloc. Supongo que esto es lo que usted necesita ya has etiquetado a su pregunta como [C].

    Si usted necesita un programa de C++ que utiliza malloc, entonces usted no tiene ninguna opción pero explícitamente el valor de retorno de malloc al tipo correcto.

Dejar respuesta

Please enter your comment!
Please enter your name here