2016-07-20 247 views
1

以下結構的定義,在我的頭文件INT類型轉換爲char *

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

typedef RemDev_Addr BTDEV_ADDR; 

現在我有以下我想使用功能的一個定義。

hci_acl_connect(UCHAR * bd_addr,UINT16 * handle); 

所以我在我的C文件

BTDEV_ADDR hsu_addr 

作出了上述結構的全局實例,並調用這樣

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

功能是鑄字是正確的「(無符號字符* )& hsu_addr「?

+1

如果''UCHAR'與編譯器+平臺上的'UINT8'類型相同,則嘗試用'hsu_addr.addr'替換'(unsigned char *)&hsu_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); 

這是假設,無論UINT8UCHARunsigned char兩個別名(這似乎是一個安全的假設)。

+0

但hci_acl_connect(UCHAR * bd_addr,UINT16 *句柄); 它的第一個參數需要一個字符指針 – Abhinav

+0

@Abhinav,您應該刷新頁面以查看對此答案的最新編輯 – ForceBru

+0

@Abhinav除非例如'short'在你的系統上是8位,'unsigned char'似乎是定義'UINT8'和'UCHAR'的唯一合理方式,這意味着兩種類型都是相同的。 –

1

從任何其他指針類型鑄造到char *unsigned char *是安全的,因爲char具有最不嚴格的對齊要求,即它可以位於任何地址。它也不會違反嚴格的鋸齒規則。

但是,反過來是未定義的行爲。更大的類型通常會有更嚴格的對齊要求,並且可能會導致嘗試在未對齊的地址執行操作。新指針也可能會替代舊指針,並且在進行優化時可能會誤導編譯器。