2009-07-26 36 views
6

Ha pasado un tiempo desde que me metí con el código C.Conversión inválida de vacío * a char **

Recibo el siguiente error al compilar el código C en Ubuntu usando gcc.

El comando que estoy utilizando para compilar el código es (si estos errores son causa de compilador que estoy usando, por favor hágamelo saber cómo hacer que desaparece):

gcc -o runnable mycode.C 

error: invalid conversion from ‘void*’ to ‘char**’

Línea 39 es :

sequence=malloc(sizeof(char *)*seqNum); 

secuencia se declara como:

char **sequence; 

SEQNUM se declara como:

int seqNum 
+10

Cambie el nombre de su archivo para que la extensión sea una "c" minúscula. GCC decide el idioma que está utilizando desde la extensión y, por alguna razón, el capital "C" significa C++. –

+0

gracias! ¡eso funciono! –

+0

Ah. El crédito aquí debe ir a sgm. Esto es exactamente correcto. – dmckee

Respuesta

7

Agregado: La solución rápida para el problema real de Arron es proporcionada por sgm en un comentario. El texto a continuación es todo exacto y, con suerte, útil, pero una segunda solución de tasa para el problema en cuestión.


su compilador está siendo muy dura cerviz sobre conversiones de puntero (¿Está utilizando un compilador de C++?), La adición de una conversión explícita como

sequence=(char**)malloc(sizeof(char *)*seqNum); 

debe cometer el error desaparezca. Alternativamente, usted podría ser capaz de convencer al compilador para ir fácil en usted con algún tipo de opción como

$(CC) --lighten-up-baby code.c 

que podría ser preferible si se trata de algún código de terceros que usted realmente no quiere piratear. Lea la documentación de su compilador para encontrar la opción que desea. Dado que todos los gcc que tengo a mano (versiones 4.0 y 4.2) están de acuerdo con ese código, no estoy en un buen lugar para ofrecer consejos sobre los conmutadores para desactivar este comportamiento.

+2

+1 exactamente. Los compiladores de C no se quejan, pero los compiladores de C++ sí. –

+0

Los compiladores C99 son más quisquillosos con la mecanografía que los compiladores C89 alguna vez, y gcc puede ser muy exigente con los modificadores -pedantic –

+0

Estoy usando gcc -o para compilar el código en ubuntu. lo que mencionaste hizo que ese error desapareciera. Pero ahora obtengo el mismo error en esta línea para (i = 0; i

5

Es necesario echado el resultado de malloc a ser el tipo que desee.

Así:

 
char **sequence; 
... 
sequence = (char **)malloc(sizeof(char *) * seqNum); 

También recuerde que si usted va a utilizar la secuencia que va a necesitar para asignar una lista de s "char *" como lo han hecho, pero entonces usted no tiene el memoria asignada asignada, solo se le asigna el espacio para la lista de punteros.

Parte de la razón por la que esto es un error es que la asignación entre diferentes tipos de punteros puede cambiar la alineación requerida. Malloc garantiza devolver un puntero al espacio con una alineación adecuada para cualquier tipo.

+2

Eso solo se aplica a C++. El póster cree que está escribiendo una aplicación C, que es menos estricta. –

+0

Ah sí, acabo de ver eso en el comentario de la respuesta. Todavía es una buena práctica lanzar el resultado de malloc en C, mente :) –

+7

Sí, no, no lo es. –