¿Cuáles son las razones para lanzar un puntero vacío?

Estoy aprendiendo C ++ desde cero, y como tal no tengo un conocimiento experto de C. En C ++, no se puede lanzar un indicador de vacío a lo que sea, y entiendo las razones detrás de eso. Sin embargo, sé que en C, puedes. ¿Cuáles son las posibles razones para esto? Simplemente parece que es un gran agujero en seguridad de tipo, lo que (para mí) me parece algo malo.

Puedes lanzar un void* a otro puntero en ambos idiomas. Tal vez quisiste decir implícitamente.

Es muy conveniente en C no tener que ser explícito al respecto. En C ++ tenemos plantillas, por lo que para escribir código genérico no hay necesidad de void* casting y todo eso. En C no hay elección. Un contenedor genérico debe contener void* a los objetos, y es mucho más fácil decir repetidamente mydata* d = node; entonces es mydata* d = (mydata*)node; .

Así que es más o menos como dijiste. En general, la seguridad de tipo C no recibió tanto énfasis como en C ++, especialmente cuando se produjo un void* porque se suponía que era un simple puntero genérico para lo que fuera. No hay necesidad de eso en C ++, así que mejor explícalo cuando lo tratas.

¿Cuáles son las posibles razones para [lanzar un puntero void * en C]? ¿No es este un agujero gigante en la seguridad de tipo?

Es la única forma posible de soportar el polymorphism, también conocido como progtwigción genérica. No hay otra forma de hacer, por ejemplo, una tabla hash genérica. El polymorphism en C es extremadamente peligroso, pero es el único polymorphism que existe.

Esté contento de que C ++ tiene polymorphism paramétrico (una de las muchas funciones de las plantillas).

Una razón: si usa la sort para ordenar una matriz de estructuras, y tiene una función de comparación para las dos estructuras, deberá convertir los punteros vacíos a los punteros a las estructuras para acceder a los miembros de la estructura.