Как скопировать статический символ* в символ без знака* в C?

#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 может не определять поведение библиотечной подпрограммы при передаче преобразованного указателя на нее, в зависимости от того, что происходит внутри библиотеки.