Char Array и uintptr_t - PullRequest
       2

Char Array и uintptr_t

2 голосов
/ 22 марта 2019

Я читал Что такое тип данных uintptr_t , но я все еще не могу понять uintptr_t здесь как

  • для каких целей он сначала преобразует временно массив символов тип в тип unsigned long int, а затем обратно обратно в тип char*.

Рассмотрим приведенный ниже снимок кода

strncpy(pCfgMgr->mGlobalCfg.grMap[index].userName,
       (char *)(uintptr_t) grParams.peerUsrName, 16); /*index is 0 */

, где userName в pCfgMgr->mGlobalCfg.grMap[index].userName - это не что иное, как массив символов, объявленный как

char userName[MAX_USERNAME_LENGTH]; /* MAX_USERNAME_LENGTH is 16 */

И peerUsrName в grParams.peerUsrName также является массивом символов, объявленным как

char peerUsrName[16];

То, чего я не получил, это то, что , что uintptr_t имеет значение при копировании, что является ничем иным, как псевдонимом unsigned long int. Мне любопытно узнать , о чем думал разработчик, используя uintptr_t здесь & рекомендуется ли ?

Хотя без uintptr_t выше оператор strncpy() выдает тот же результат.

Все помогают оценены искренне.

1 Ответ

2 голосов
/ 22 марта 2019

В ролях нет необходимости.

Второй аргумент strncpy имеет тип const char *. Здесь также допустимо выражение типа char *. grParams.peerUsrName имеет тип char [16]. Массивы в большинстве случаев затухают до указателя на первый элемент. Поэтому, когда вы передаете его strncpy, оно распадается на char *, что и ожидается. Так что нет необходимости в актерском составе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...