#c #char #unsigned
Вопрос:
Я использую функцию libray, которая ожидает ввода в виде символа без знака*, и у меня есть статический массив символов, который необходимо передать в библиотечную функцию. Лучше ли скопировать символ со знаком* в переменную без знака* и передать ее функции или следует выполнить простое приведение?
void test()
{
static char test[1024];
libAPI(test);
}
void libAPI(unsigned char* test)
{
----------------
}
Комментарии:
1. Достаточно простого актерского состава.
2.
LibAPI((unsigned char *)test);
3. Допустимо ли преобразование символа со знаком* в символ без знака*
4. Это гипс. Вы просто говорите компилятору: «забудьте его начальный тип и сделайте так, как если бы он был без знака вместо этого!» (без преобразования)
5. Почему бы не изменить свой массив с
char
наunsigned char
?
Ответ №1:
Поскольку типы символов в C являются особыми, указатель на любой тип объекта может быть преобразован в указатель на тип символа и использован для доступа к байтам объекта. C 2018 6.3.2.3 7 говорится:
… Когда указатель на объект преобразуется в указатель на тип символа, результат указывает на младший адресованный байт объекта. Последовательное увеличение результата до размера объекта приводит к указателям на оставшиеся байты объекта.
Таким образом, вы можете преобразовать a char *
в an unsigned char *
и передать его в библиотечную процедуру, предположив, что библиотечная процедура действительно будет использовать его для доступа unsigned char
, а не для выполнения с ним махинаций. Это static
не имеет значения.
Обратите внимание , что если объект был определен с volatile
помощью или const
, эти квалификаторы должны соблюдаться.
Как правило, это не относится к другим типам. Если у вас есть указатель на int
, и подпрограмма ожидает указатель unsigned int
, стандарт C может не определять поведение библиотечной подпрограммы при передаче преобразованного указателя на нее, в зависимости от того, что происходит внутри библиотеки.