簡體   English   中英

Function 返回指向數組的指針 - 轉換並獲取值

[英]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

這些中的任何一個都可能導致各種“有趣”的現象。 我敢打賭,這是由於 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM