2016-07-20 1 views
1

После определения структуры определяется в одном из моего файлаПриведение ИНТ на символ *

typedef struct REMDEV_ADDR { 
UINT8 addr[DEVICE_ADDR_SIZE]; 
} RemDev_Addr; 

typedef RemDev_Addr BTDEV_ADDR; 

заголовка Теперь я следующей функции, которую я хочу использовать.

hci_acl_connect(UCHAR * bd_addr,UINT16 * handle); 

Так что я сделал глобальный экземпляр выше структур в моем файле Си

BTDEV_ADDR hsu_addr 

и вызов функции, как этого

hci_acl_connect((unsigned char *)&hsu_addr,&cont_hand); 

Является типажи правильно «(неподписанный символ *) & hsu_addr "?

+1

Если 'UCHAR' - это тот же тип, что и' UINT8' на вашей платформе компилятора +, попробуйте заменить '(unsigned char *) & hsu_addr' только на' hsu_addr.addr'. В противном случае отправьте * много * больше контекста. – dxiv

ответ

1

Да, конечно. Ваша переменная находится в стеке, но вам нужно указать указатель, поэтому вы используете &your_var. Вам нужен указатель на UCHAR, поэтому вы делаете акцент: (UCHAR *)&your_var.

Кастинг сам по себе, но мы не знаем, что должно представлять UCHAR * bd_addr. Может быть, вы должны пройти your_var.addr?

2

Предполагая, что вы хотите, чтобы функция что-то делала с массивом addr в структуре, тогда нет необходимости в литье. Просто пройти addr член:

hci_acl_connect(hsu_addr.addr, &cont_hand); 

Это предполагает, что оба UINT8 и UCHAR являются псевдонимами unsigned char (который, кажется, как безопасное предположение).

+0

, но hci_acl_connect (UCHAR * bd_addr, UINT16 * handle); Его первый аргумент требовал указателя char – Abhinav

+0

@Abhinav, вам, вероятно, вероятно, обновите страницу, чтобы увидеть последнее изменение этого ответа – ForceBru

+0

@Abhinav If e.g. 'short' - 8 бит в вашей системе,' unsigned char' кажется единственным разумным способом определения как 'UINT8', так и' UCHAR', что означает, что оба типа одинаковы. –

1

Отливка из любого другого типа указателя на char *unsigned char * или безопасен, потому что char имеет наименее жесткие требования к выравниванию, то есть, она может быть расположена по любому адресу. Это также не нарушит строгое правило сглаживания.

Обратное, однако, является неопределенным поведением. У более крупного типа обычно будут более строгие требования к выравниванию, и это потенциально может привести к попытке выполнить операцию с несогласованным адресом. Новый указатель также может быть псевдоним старого и который потенциально может ввести в заблуждение компилятор при выполнении оптимизаций.

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

  • Нет связанных вопросов^_^