Puntero de estructura emitido como uint8_t * arroja un error

en mi función, asigno memoria y relleno una estructura llamada messagePacket

struct messagePacket *packet = malloc(sizeof(struct messagePacket));
//fill

Cuando trato de convertir el puntero en (uint8_t *), gcc lanza una advertencia que dice: entero grande implícitamente truncado a tipo sin firmar

sendBuf(..., (uint8_t *)packet);

Pude hacer lo siguiente muy bien, y entiendo que puedo usar este enfoque como una solución alternativa. Estoy aquí porque prefiero aprender de esto que solucionarlo.

uint8_t *buf = malloc(sizeof(struct messagePacket));

El tamaño de struct messagePacket = 1209 B. Mi mejor suposición es que la porción de memoria es súper grande y se almacena en una dirección de memoria alta, como una dirección de 16 byes. Pero eso no encaja con el hecho de que puedo malloc un uint8_t * del mismo tamaño.

preguntado el 26 de abril de 12 a las 08:04

¿Qué sendBuf hacer ? -

@cnicutar no creo que eso importe, porque el elenco parece ser el problema -

@pivotnig lo creo importa porque ese elenco puede ser superfluo o simplemente incorrecto. Según el estándar, ya está bastante mal. -

sendBuf toma el uint8_t *, crea un uint8_t similar *recvBuf = sizeof(struct messagePacket), los datos de send() a través de un puerto, los datos de select() y recv() -

code #include <stdio.h> #include <stdlib.h> struct messagePacket { int a; int b[2000]; }; void sendBuf(char * d) { int c; c=*d; } int main() { struct messagePacket *packet = malloc(sizeof(struct messagePacket)); sendBuf((unsigned char*)packet); return 0; } No puedo ver el error. -

2 Respuestas

Supongo que el compilador nota que su estructura es más grande que 8 bits y usa uint8_t solo abordará el primer byte de la estructura. Dado que esto parece ser la intención, podría lanzar a (void *) y luego a (uint8_t *). Pero debe decirle a sendBuf el tamaño del búfer que es sizeof(struct messagePacket).

Respondido 26 Abr '12, 08:04

el compilador era demasiado inteligente para tales travesuras de doble casting. y enviar buf definitivamente obtiene ese tamaño - Austin

Creo que la advertencia es sobre algún otro argumento. Proporcione el código completo para esa línea, el prototipo para el sendBuf() y la advertencia completa del compilador para la línea en cuestión.

Como idea general, la sendBuf() La función probablemente debería usar un const void * preferible a const uint8_t * para que los datos se envíen. Ver send() y amigos.

Respondido 26 Abr '12, 08:04

relajarse gana. Necesito mejorar al hacer preguntas (es decir, al menos publicar el código completo). estaba pasando sizeof(struct messagePacket) a un argumento de tipo uint8_t que está fuera de rango. Lo pasé por alto porque mis argumentos estaban en diferentes líneas, y el compilador me señaló la línea sobre la que pregunté originalmente: Austin

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