簡體   English   中英

C中如何將char指針數組轉換為int指針數組

[英]How to convert a char pointer array into a int pointer array in C

我有一個 8 字節的 char 指針,其中存儲了 2 個整數。 如何將它存儲在 int 數組指針中,以便 int 數組的第一個 integer 在array[0]中,第二個 integer 在array[1]中。

到目前為止我制作的代碼:

char * wirte_buff= (char*) malloc(8*sizeof(char*));
int i, j;
i =  16;
j = 18;

/*separates integer i and integer j into 4-bytes each*/ 
for(n=0; n<=3; n++){
  wirte_buff[n] = (i >> 8*(3-n)) & 0xFF;
  wirte_buff[4+n] = (j >> 8*(3-n)) & 0xFF; 
}

int* intArray = (int*) wirte_buff; //puts char pointer to 
printf("intArray[0] value is %d \n", intArray[0]);
printf("intArray[1] value is %d \n", intArray[1]);

當我這樣做時,預期的結果是 16 和 18,但我意外地得到了 268435456 和 301989888。

假設您知道嚴格的別名規則違規,您的代碼將在大端架構中生成您期望的結果,其中組成 integer 的四個字節從最高有效字節開始存儲:

------------------------------------------------------------------------------
| byte3 (bit 24:31) | byte2 (bit 16:23) | byte1 (bit 8:15) | byte0 (bit 0:7) |
------------------------------------------------------------------------------

但是你顯然是在一個小端架構機器上運行你的代碼:

------------------------------------------------------------------------------
| byte0 (bit 0:7) | byte1 (bit 8:15) | byte2 (bit 16:23) | byte3 (bit 24:31) |
------------------------------------------------------------------------------

因此,為了在 char 數組中替換您的 integer,您需要:

  1. i的字節 0,即i >> (8 * 0) ,位於wirte_buff數組的索引 0
  2. i的字節 1,即i >> (8 * 1) ,位於wirte_buff數組的索引 1
  3. i的字節 2,即i >> (8 * 2) ,位於wirte_buff數組的索引 2
  4. i的第 3 個字節,即i >> (8 * 3) ,位於wirte_buff數組的索引 3

這翻譯成

wirte_buff[n] = (i >> 8*(n)) & 0xFF;

當然,對於j也是如此:

wirte_buff[4+n] = (j >> 8*(n)) & 0xFF;

這段代碼在很多方面都是錯誤的。

  • char * wirte_buff= (char*) malloc(8*sizeof(char*)); 分配 8 char*並且沒有數據。 您不會在任何地方分配這些指針,因此它們保持未初始化狀態。
  • i >>... etc 對有符號類型執行按位運算,這總是錯誤的。 如果該值為負數,您最終會得到實現定義的結果。
  • 如果您將int值轉換為char ,那么char具有實現定義的符號,因此您不知道最終是負值還是上溢/下溢。

  • 如果你也避免這種情況,你不能用(int*) wirte_buff;通過另一種類型讀回char ... intArray[0]因為這些不是兼容的類型。 您可能會讀取未對齊的數據。 您還將違反嚴格的指針別名,請參閱什么是嚴格的別名規則?

發布的代碼沒有預期的行為,我懷疑你可以挽救它。 您將不得不從頭開始重新編寫它,尤其是避免所有可疑的轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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