conversión de void* a char*

#include <stdio.h>
#include <stdlib.h>

int main() {
    void *malloc(size_t size);
    char *ptr, *retval;
    ptr = (char *)calloc(10, sizeof(char));

    if (ptr == NULL)
        printf("calloc failed\n");
    else
        printf("calloc successful\n");

    retval = realloc(ptr, 5);

    if (retval == NULL)
        printf("realloc failed\n");
    else
        printf("realloc successful\n");

    free(ptr);
    free(retval);
}

aquí está mi código, el error surge en la línea 14, dice

conversión no válida de "void*" a "char*"

preguntado el 21 de mayo de 12 a las 19:05

Esto no es C++, así que no lo etiquetes como tal. -

¿Puedes reformatear esto para que se lea más limpio? -

@Goz: Si supiera lo que está haciendo, lo compilaría como C. :P -

@jamesdlin: Bueno en recordar cambiar el número de línea;) -

Para las personas que están en guerra de edición por las etiquetas: esta es sin duda una pregunta sobre C++. Este problema puede , solamente sucede al compilar como C++. Si la etiqueta C debe Además, ser incluido es discutible (me inclinaría por dejarlo, ya que esto resalta una diferencia importante entre los dos idiomas), pero la etiqueta C++ se aplica absolutamente. -

4 Respuestas

Podrías convertir el resultado de la realloc en (char*) como lo haces con malloc.

retval = (char*)realloc(ptr, 5);

Irónicamente, aunque lo que ha escrito es un código "C" perfectamente legal ... pero no C ++ donde necesita el elenco. Entonces, también puede intentar configurar su compilador para compilar el código como "C", ya que no está haciendo nada de C ++ y eso resolvería igualmente el problema. Dicho esto, la modificación anterior también es perfectamente legal en C ... por lo que se compilaría en C ++ y C.

Editar: como Softy señala correctamente, reasigna ptr y almacena la ubicación del puntero en retval, lo que significa que ptr, potencialmente, apunta a una memoria no válida y NO debe liberarla. En el mejor de los casos, libera la misma memoria dos veces, en el peor de los casos, llama a la memoria que ya ha sido liberada (mediante realloc). De cualquier manera es malo (tm). Tal como está, está invocando un "comportamiento indefinido" grave.

contestado el 21 de mayo de 12 a las 19:05

bien!!gracias por sus respuestas. de todos modos, lo hice :) y lo siento por las etiquetas, ya que era mi primera pregunta, así que no sabía cómo usarlas;) gracias de todos modos;) - ejaz dogar

@ejazdogar: Si hace clic en la pequeña marca debajo del número a la izquierda de mi publicación, "acepta" mi publicación;) - Goz

No puede liberar un puntero dos veces. Aquí, retval y ptr apuntan a la misma ubicación, agregue este código y verifique antes de la llamada gratuita:

printf("%p \n ",ptr);
printf("%p \n",retval);

realloc ha reducido el tamaño pero la ubicación del puntero sigue siendo la misma. puedes probar esto también:

if(ptr == retval)

/* delete either ptr or retval - just for sake of this programm , Idealy you shouldnt free the the pointer like this as Rightly Suggested by **Goz** in C++/c*/

Solo para que funcione. De lo contrario, compila bien con gcc, pero si lo ejecuta, dará un seguimiento de pila sucio mientras intenta liberar el mismo puntero dos veces. La llamada de interrupción subyacente de la función de asignación de memoria puede o no asignar el mismo puntero hacia él. SI expande el tamaño puede ser 30 o 50, puede darle un puntero diferente.

rgds, suave

contestado el 21 de mayo de 12 a las 19:05

Tienes un buen punto, pero después de reasignar absolutamente nunca debes liberar ptr... ¡o apunta a la misma ubicación que retval o ya ha sido liberado! - Goz

sí, puede o no, ¡es por eso que se verifica la equivalencia de ptr! - raulp

pero si no son iguales (o incluso si lo son), entonces no deberías liberar ptr... por lo que la verificación de equivalencia es irrelevante... llamar gratis a ptr es un error a punto de ocurrir... - Goz

ralloc no necesita reducir el espacio, puede devolver una memoria completamente diferente. if (retval != NULL) {ptr = retval;} - martín york

Otros han notado que su código C se está compilando como código C++. El molde no es necesario en C, pero se requiere en C++. En C++, debe usar vectores (o cadenas).

Aquí hay algunas observaciones sobre su código:

  1. No vuelva a declarar malloc. Incluir stdlib.h lo hará por usted. Afortunadamente, ha duplicado su declaración con éxito, por lo que solo es redundante (y confuso para otra persona que lee el código). Si se equivocó en la declaración, tiene un comportamiento indefinido.

  2. No libere 'ptr' si la realloc tiene éxito.

  3. Algunas personas pueden señalar que, en algunos sistemas esotéricos, calloc puede no hacer lo que espera (específicamente para los tipos de puntero y punto flotante). Teniendo en cuenta que desea que su espacio asignado dinámicamente se inicialice con valores adecuados de todos modos, es superfluo llamar a calloc en lugar de malloc.

contestado el 21 de mayo de 12 a las 19:05

Si quieres que compile, usa la compilación C. Parece como si estuviera usando la compilación de C++. Es válido C pero no válido C++. En la mayoría de los compiladores, usar una extensión .c en minúsculas hará que el compilador use la compilación C automáticamente. .cpp causará la compilación de C++, también .C (mayúsculas) puede causar la compilación de C++ (en gcc, por ejemplo).

contestado el 21 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.