Указатель структуры, приведенный как uint8_t *, выдает ошибку

в моей функции я выделяю память и заполняю структуру с именем messagePacket

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

Когда я пытаюсь привести указатель к (uint8_t *), gcc выдает предупреждение, в котором говорится: большое целое число неявно усечено до беззнакового типа

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

Я смог сделать следующее просто отлично, и я понимаю, что могу использовать этот подход в качестве обходного пути. Я здесь, потому что я предпочитаю учиться на этом, чем работать над этим.

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

Размер struct messagePacket = 1209 B. Мое лучшее предположение состоит в том, что кусок памяти очень большой, и я храню его в старшем адресе памяти, таком как адрес 16 bye? Но это не согласуется с тем фактом, что я могу malloc uint8_t * того же размера.


person austin    schedule 26.04.2012    source источник
comment
Что делает sendBuf?   -  person cnicutar    schedule 26.04.2012
comment
@cnicutar я не думаю, что это имеет значение, потому что проблема, похоже, в актёрском составе   -  person thumbmunkeys    schedule 26.04.2012
comment
@pivotnig Я думаю, что это имеет значение, потому что этот состав может быть излишним или просто неправильным. По стандарту это уже довольно неправильно.   -  person cnicutar    schedule 26.04.2012
comment
sendBuf принимает uint8_t *, создает аналогичный uint8_t *recvBuf = sizeof(struct messagePacket), данные send() через порт, данные select() и recv()   -  person austin    schedule 26.04.2012
comment
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; } Я не вижу ошибки.   -  person wuliang    schedule 26.04.2012


Ответы (2)


Я думаю, что предупреждение касается какого-то другого аргумента. Предоставьте полный код этой строки, прототип функции sendBuf() и полное предупреждение компилятора для рассматриваемой строки.

Как правило, функция sendBuf() должна использовать const void *, а не const uint8_t * для отправки данных. Смотрите send() и друзей.

person unwind    schedule 26.04.2012
comment
раскрутить победы. мне нужно лучше задавать вопросы (то есть: по крайней мере, размещать полный код). я передавал sizeof(struct messagePacket) в аргумент типа uint8_t, который находится далеко за пределами допустимого диапазона. я пропустил это, потому что мои аргументы были в разных строках, и компилятор указал мне на строку, о которой я изначально спрашивал - person austin; 26.04.2012

Я предполагаю, что компилятор замечает, что ваша структура больше 8 бит, и с помощью uint8_t вы будете обращаться только к первому байту структуры. Поскольку это, кажется, предназначено, вы можете привести к (void *), а затем к (uint8_t *). Но вы должны сообщить sendBuf размер буфера, который равен sizeof(struct messagePacket).

person konqi    schedule 26.04.2012
comment
компилятор был слишком умен для таких махинаций с двойным кастингом. и send buf определенно получает такой размер - person austin; 26.04.2012