2010-07-14 3 views
1

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

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

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

ответ

3

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

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

+0

@R., Немного коррекции, наличие 'unit8_t' предписана POSIX, а не по С. –

+0

C гарантирует, что существует, если 8bit существует целочисленный тип. Если нет 8-битного типа, то также невозможно определить свой собственный «UBYTE». Поскольку этот вопрос связан с обработкой заголовков HTTP, целью является почти наверняка платформа, оборудованная для работы с сетевыми блоками данных (байты). 'CHAR_BIT! = 8' - это действительно патология, о которой не стоит упоминать. Это никогда не будет происходить, за исключением DSP и grandfathered-in унаследованных машин, которые никогда не станут мишенями для переносных программ. –

+0

@R, что они назвали его UBYTE, не означает, что он имеет ширину 8. Он показывает только то, что они ожидают. –

0

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

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

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

Почему я предпочитаю использовать char *, использовать один и тот же тип данных , Функция 1 Вызывает функцию2 (передавая параметр char *). Функция 2 копирует ее в местный Убайт *. Функция 2 вызывает функцию 3 (которая принимает char *). Итак, в моем мнении функция2 действует как пропуск через Function1 - Function3 и неоправданно изменяет ее на UBYTE, добавляя накладные расходы на приведение типов или ссылающиеся/де-ссылки на указатели. PS: Я не вижу никакой логической проблемы с моим кодом, поскольку текущий код работает как в выпуске (O2), так и в отладке (O3, g) + дополнительных отпечатков в проблемной функции. – Aryan

+0

Спасибо Джен за ответы и прозрение. Просто для того, чтобы проясниться, его не я удовлетворен или так. У меня со старым письменным кодом, где люди с течением времени меняли его на свой комфорт. С производственным кодом я имел в виду, что нет никаких логических проблем с функциями Parse, поскольку он работает так долго. Я просто пытаюсь выяснить рациональное различие между Char * и UBYTE *. Возможно, я ошибаюсь, придерживаясь только этого и должен изучить некоторые другие аспекты кода. :-( – Aryan

+0

@Ayan, я полагаю, что в такой установке сложно что-то узнать. Но если вы должны очистить этот код, начиная с более разумной схемы типов, это будет хорошей идеей. Если вы увидите много неприятные ошибки исчезают, просто подбирая код таким образом. Удачи в любом случае. –

Смежные вопросы