将int数组强制转换为char数组的内存访问疑问
问题解答
首先看你的代码:
int* array = new int[5]; array[0] = 65; array[1] = 66; array[2] = 67; array[3] = 68; array[4] = 69; char *arr = (char*)array;
第一个问题:int数组的每个4字节是否会变为char数组的每个1字节?
是的,完全正确。
- 通常
int在主流系统中占4字节,char固定占1字节。当你把int*强制转为char*后,指针的访问步长从4字节(每次跳一个int)变成了1字节(每次跳一个char)。 - 你举的数值例子里,比如
array[0]=65对应的二进制是00000000 00000000 00000000 01000001,这段4字节内存会被拆成4个char元素,但具体哪个字节对应arr的哪个索引,取决于系统的字节序:- 小端序(主流x86/x86_64架构):低字节存在内存低地址,所以
arr[0]是01000001(即ASCII的'A'),arr[1]、arr[2]、arr[3]都是0; - 大端序:高字节存在内存低地址,所以
arr[0]是0,arr[3]才是01000001。
- 小端序(主流x86/x86_64架构):低字节存在内存低地址,所以
第二个问题:char数组arr是否可以访问0-19的索引?
可以。
new int[5]分配了连续的20字节内存(5个int× 4字节/int),arr指向这段内存的起始地址。- C++标准允许用
char*(或unsigned char*)来访问任意对象的内存表示,这是合法的类型双关操作。只要你访问的范围在分配的20字节内(0-19索引正好覆盖全部内存),就不会触发未定义行为,可以正常访问每个字节。
内容的提问来源于stack exchange,提问作者Akbar294
相关产品推荐
相关产品推荐

