[英]What happens when you cast an integer array into a char array
我對這個轉換是如何工作感到困惑,因為我的代碼如下所示,1 2 3 4 5的數組將被轉換為1'\\ 0'的char數組。 這是如何運作的?
#include<stdio.h>
#include<string.h>
#define SIZE 5
int main(){
int array1[SIZE] = { 1, 2, 3, 4, 5 };
int array2[SIZE];
char* array = (char*)array1;
int i = 0;
while(array[i] != '\0'){
printf("%d ", array[i]);
i++;
}
}
你在這里做的是所謂的打字和皺眉。 [ 編輯:在這里添加奧拉夫的評論:這是因為你的代碼鑄件上的指針發生,而不是在數據它指向。]從你的描述,你是在一個小端架構-假設它是32位, int
為1將占用4個字節(32位)並表示如下:
{ 1, 0, 0, 0 }
所以你的整個數組,解釋為一系列字節,看起來像
{ 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, ... }
請注意,這實際上取決於您的實現和體系結構,所以不要打字 。 這就是為什么標准聲明通過與聲明的一個未定義行為不同類型的指針訪問存儲值的原因 。 (或者,在這種情況下,作為對char *
類型懲罰是允許一些必要的用例, 實現定義的行為的例外 - 您仍然在不同的環境中獲得不同的讀數)
結果是實現定義的 。 這取決於您機器上的字節順序 ; 在x86的情況下,它是小端的。
array
是指向array1
的指針。 因為你的機器顯然是小端(我猜x86), array1
內部看起來像這樣,假設sizeof(int)
等於4
:
0x01 | 0x00 | 0x00 | 0x00 | 0x02 | 0x00 | 0x00 | 0x00 | 0x03 | ...
所以,如你所見,第一個char
的值是0x01
,接着是0x00
。 因此結果。
這是因為int的大小是4個字節,但char的大小是1個字節。 在這種情況下,當您將char轉換為int(1字節到4)時,您將從1 int獲得4個字符。 我們試試吧
#include<stdio.h>
#include<string.h>
#define SIZE 5
int main(){
int array1[SIZE] = { 1, 2, 3, 4, 5 };
int array2[SIZE];
char* array = (char*)array1;
int i = 0;
while(array[i] != '\0'){
printf("%d ", array[i]);
i=i+4;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.