Pregunta

    int length = strlen(src);
    char *structSpace = malloc(sizeof(String) + length + 1);
    String *string = (String*) structSpace;    
    int *string = (int*) structSpace;

* Creé una estructura llamada String

¿Fue útil?

Solución

No lo haces. void* se convertirá implícitamente en lo que necesite en C. Consulte también las Preguntas frecuentes sobre C sobre por qué querrías evitar explícitamente enviar el regreso de Malloc en C. La respuesta de @ Sinan ilustra aún más por qué esto se ha seguido de manera inconsistente.

Otros consejos

Debido a que malloc devuelve un puntero al vacío, es decir, simplemente está asignando fragmentos de memoria sin tener en cuenta los datos que se almacenarán allí. En C ++ su vacío * devuelto no se convertirá implícitamente en el puntero de su tipo. En su ejemplo, no ha lanzado lo que ha devuelto malloc. Malloc devolvió un vacío * que se lanzó implícitamente a un char *, pero en la siguiente línea usted ... ok, ya no tiene mucho sentido.

Este es uno de los pocos problemas que hace que la declaración & "; C ++ es un superconjunto de C &"; No es completamente cierto. En C, un puntero void se puede convertir implícitamente en cualquier otro tipo de puntero. Sin embargo, C ++ es un poco más estricto con la seguridad de tipo, por lo que debe emitir explícitamente el valor de retorno de malloc al tipo apropiado. Por lo general, esto no es un gran problema, porque el código C ++ tiende a usar new en lugar de <=>, lo que no requiere conversión de texto.

En C, emitir el resultado de malloc es innecesario y no debe hacerse. Hacerlo puede, por ejemplo, ocultar el error de haber fallado a #include <stdlib.h>, por lo que no tiene un prototipo de malloc en su alcance. Esto, a su vez, puede conducir a otros errores y a la falta de portabilidad (aunque los peores delincuentes a ese respecto ahora son en su mayoría obsoletos).

En C ++, debe emitir el resultado de malloc para asignarlo a un puntero a cualquier tipo que no sea vacío. A menos que realmente necesite escribir código que se pueda compilar como C o C ++, sin embargo, generalmente debe evitar usar malloc en C ++ y asignar memoria usando new.

Sueles ver este tipo de código C de principiantes (o codificadores C ++ :-)):

int main() {
    int len = 40;
    char *my_string = (char *) malloc(sizeof(char)*len);
    return 0;
}

Esto es innecesario y malvado, puedes evitar el inútil lanzamiento incluyendo stdlib.h

#include <stdlib.h>
int main() {
    int len = 40;
    char *my_string = malloc(sizeof(char)*len);
    return 0;
}

Debe considerar encarecidamente la conversión después de usar el comando malloc porque proporciona una mayor portabilidad y una mayor compatibilidad con otras partes de su programa. Si no lo hace, puede correr el riesgo de tipos de datos incompatibles que podrían provocar errores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top