![](/img/trans.png)
[英]Is it legal to cast a function returning an object pointer to a function returning a void pointer?
[英]Function returning pointer to array - cast and get value
我的代碼幾乎沒有兩難選擇。
我有 function 它將指針(uint8_t *)返回到數據緩沖區。 當我需要數組中的 2 個值作為 uint16_t 時,將此指針轉換為 uint16_t 是否可行且合法? 還是對齊會有問題? 通過從 I2C 讀取字節來填充緩沖區。
這個問題存在於 MCU 上,但是當我用 visualstudio 嘗試這個時,沒關系。 MCU - 硬故障
uint8_t arr[8];
uint8_t * FuncReturnPointer(void)
{
arr[0] = 0xEE;
arr[1] = 0xFF;
return arr;
}
main
{
uint16_t val16 = 0;
val16 = *(uint16_t*)FuncReturnPointer();
}
有什么問題/危險嗎?
這里有兩個單獨的問題:
這些中的任何一個都可能導致各種“有趣”的現象。 我敢打賭,這是由於 alignment 違規,即arr
不會恰好位於可被_Alignof(uint16_t)
整除的地址。 正確的解決方法是使用
算術:
val16 = ((uint16_t)*address << 8) | (address);
memcpy
:
memcpy(&val16, address, sizeof (val16));
指針中的 uint8_t、uint16_t、char 等類型實際上告訴程序如何處理指向地址中的值。 您的 function “FuncReturnPointer”返回“arr”數組的地址,該數組是一個 8 位類型的數組。 當您將 (uint16_t *) 類型轉換器添加到 function 中時,它實際上是將其視為 16 位數字並將其存儲為 0x00EE 而不是 0xEE。 好的做法是這樣的:
main
{
uint16_t val16 = 0;
uint8_t *address;
address = FuncReturnPointer(); //this gets the address of the arr
val16 = (*(address++)<<8) + (*address);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.