[英]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,您需要:
i
的字節 0,即i >> (8 * 0)
,位於wirte_buff
數組的索引 0i
的字節 1,即i >> (8 * 1)
,位於wirte_buff
數組的索引 1i
的字節 2,即i >> (8 * 2)
,位於wirte_buff
數組的索引 2i
的第 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.