conversión no válida de ‘void *’ a ‘node *’

Tengo un progtwig en C que produce un error:

invalid conversion from 'void*' to 'node*' [-fpermissive] 

Aquí está mi código:

 #include #include #include struct node { int data; struct node* next; }; struct node* onetwothree(); int main() { struct node* ptr; ptr = onetwothree(); return 0; } struct node* onetwothree() { struct node* head; struct node* temp; head = malloc(sizeof(struct node)); temp = head; for(int i=1; idata = i; if(inext; else temp->next = NULL; } return head; } 

¿Qué estoy haciendo mal?

En C, un void* es implícitamente convertible en una T* donde T es cualquier tipo. De la sección 6.3.2.3 Punteros del estándar C99:

Un puntero para anular se puede convertir ao desde un puntero a cualquier tipo de objeto incompleto o incompleto. Un puntero a cualquier tipo de objeto o incompleto se puede convertir en un puntero para anular y viceversa; El resultado se comparará igual al puntero original.

malloc() devuelve un void* y se puede asignar sin lanzar a head , un struct node* . Esto no es cierto en C ++, por lo que sospecho que se está utilizando un comstackdor de C ++ para comstackr este código C.

Por ejemplo:

 #include  int main() { int* i = malloc(sizeof(*i)); return 0; } 

cuando se comstack con:

gcc -Wall -Werror -pedantic -std = c99 -pthread main.c -o main

No emite errores. Cuando se comstack con:

g ++ -Wall -Werror -pedantic -std = c ++ 11 -pthread main.cpp -o main

emite:

main.cpp: en la función ‘int main ()’: main.cpp: 5: 31: error: conversión no válida de ‘void *’ a ‘int *’ [-fpermissive]


Además, la función onetwothree() no está asignando memoria correctamente. Asigna un solo struct node :

 head = malloc(sizeof(struct node)); 

y luego, eventualmente, desreferenciar head->next->next que es un comportamiento indefinido. Se requiere un malloc() individual para cada struct node . Recuerda free() lo que era malloc() d.

Está teniendo esta advertencia / error porque está usando malloc (que devuelve un void* ) para inicializar una estructura de tipo node* sin realizar una conversión explícita.

Para deshacerte de este error, puedes cambiar tu código de esta manera:

 head = (struct node *)malloc(sizeof(struct node)); 

o también puede agregar el indicador “-fpermissive” a su comstackdor que luego ignorará estos errores.

EDIT: Pero sí, no pensé en el hecho de que esto no debería suceder en un comstackdor de C de todos modos