我正在做一些实验来看看 C 如何在堆栈上分配变量。以下代码出现了一些奇怪的行为。C 似乎正在向下增长堆栈,因此在以下示例中,字符 c 分配在紧接在 short s 之前的字节中。然后我创建一个 int 指针bigRandP
并将其指向 c 占用的同一位置,因此它看到的“int”与 s 占用的堆栈空间重叠。然后我尝试为 int 指针引用的位置分配一些东西。
unsigned short nameSum = 0;
unsigned char smallRand = 0;
unsigned int* bigRandP;
//The "int" pointed to by iP should overlap s
bigRandP = (unsigned int*)(&smallRand);
printf("%p %p %p\n", &nameSum, &smallRand, bigRandP);
printf("%u %u %u\n", smallRand, nameSum, *bigRandP);
*bigRandP = 0;
printf("%p %p %p\n", &nameSum, &smallRand, bigRandP);
printf("%u %u %u\n", smallRand, nameSum, *bigRandP);
0028FF1A 0028FF19 0028FF19
0 0 419430400
0028FF1A 0028FF19 0028FF00
0 0 4210788
打印的结果很有趣。不仅分配失败(bigRandP 指向的 int 未设置为 0),而且 int 指针本身被静默地重新定位以指向堆栈下方的其他位置。到底是怎么回事?这是 C 编译器阻止我用重叠指针覆盖其他变量的方法吗?