Тип приведения между char * и UBYTE * (без знака char *) - PullRequest
1 голос
/ 14 июля 2010

Фон: я получаю массив как char * как часть сеанса сокета. Теперь мы должны сопоставить токены (заголовки HTTP) из него. Код здесь заключается в том, что мы создали UBYTE * и получаем значение из массива char после типизации с помощью UBYTE. Позже тот же самый указатель UBYTE, который мы передаем другой функции, которая принимает char * после того, как привела его к char *.

Проблема здесь в том, что это работает в сборке релиза, а не в сборке отладки (с -g и другой оптимизацией). Не только это добавление нескольких отпечатков в режиме отладки скрывает проблему.

Итак, мой вопрос: в чем разница между указателем UByte (который по сути является беззнаковым символом) и указателем символа. Изменение UByte на char решает мою проблему во всех режимах, но у меня нет объяснения тому же? Есть мысли?

Ответы [ 2 ]

3 голосов
/ 14 июля 2010

Нет ничего плохого в приведении между char * и unsigned char *.Если вы получаете неожиданное поведение, которое меняется в зависимости от уровней оптимизации, в вашем коде, безусловно, есть ошибка, но она, вероятно, не имеет ничего общего с отбрасыванием подписи в приведении.

Помимо этого, UBYTE - этодовольно нелепый typedef, поскольку существует стандартный тип C, uint8_t, который идентичен и определен в stdint.h.

0 голосов
/ 14 июля 2010

Возможно, вы могли бы объяснить, во-первых, почему вы, хотя вы должны были использовать unsigned char в первую очередь? И что не работает означает?

void*, char* и unsigned char* имеют различную семантику, и вы должны использовать их в соответствии с этим:

  • void* указывает на неопределенные данные, с которыми вы ничего не сможете сделать, если не приведете их к какому-либо реальному типу
  • char* к сожалению, имеет два разных значения, либо как текстовая строка, либо как неспецифичные данные, но которые могут быть адресованы (исправлены) на низком (байтовом) уровне
  • signed char и unsigned char - целые числа небольшой ширины, для которых вы хотите выполнить арифметику
...