#include<stdio.h>
#include<stdlib.h>
static char mem[4];
int main()
{
int* A = (int*)(mem);
mem[0] = 0;
mem[1] = 1;
mem[2] = 2;
mem[3] = 3;
int i;
A[0] = 5;
for (i = 0; i<4; i++)
{
printf("%d\t", mem[i]);
}
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么打印5 0 0 0而不是5 1 2 3?为什么阵列"消失了?"
在你的情况下
A[0] = 5;
Run Code Online (Sandbox Code Playgroud)
写5为整数,其大小大于char(2,4,8,取决于).
你的系统似乎是小端,所以5写在第一个char位置,然后是零.
请注意,如果sizeof(int)是8(因为它可能在某些系统上发生),您的代码是不安全的并且会触发未定义的行为,因为它会覆盖通过mem阵列的内存(更不用说可能导致操作速度减慢甚至在某些处理器上崩溃的错位问题)
这就是为什么我们必须遵守严格的别名规则以避免"撒谎到编译器",例如,创建一个union以便编译器可以调整对齐和检查大小.
这个其他问答是相关的:当地址不是字对齐时,在C中将char*地址转换为int*时会发生什么?