大家先看一个题目(今天做的时候被小小的坑到了)
求这个程序的运行结果
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5};
short *p = (short*)arr;
int i = 0;
for(i=0; i<4; i++)
{
*(p+i) = 0;
}
for(i=0; i<5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
应该有不少人会认为答案是0 0 0 0 5(也可能我太菜)。
首先明确数组在内存中所占的空间是有顺序的,在用指针修改数据的时候必须逐个修改,不能跨越。
这个就是题目中数组的存储方式。又因为指针类型是short*,所以*p在第一个循环中每次只能修改两个字节。
|
故改变之后,数组中内容如下: | |
|
0x00ECFBF4: 00 00 00 00 | |
|
0x00ECFBF8: 00 00 00 00 | |
|
0x00ECFBFC: 03 00 00 00 | |
|
0x00ECFC00: 04 00 00 00 | |
|
0x00ECFC04: 05 00 00 00 |
这篇博客探讨了一段C++代码,该代码通过short指针修改了一个整型数组的内容。由于指针类型的影响,每次修改了两个字节,导致数组元素前两个字节被置零。运行结果并非预期的00005,而是数组中的高位字节被保留,低位字节清零。博客重点讲解了内存布局、指针操作以及数据类型的对齐规则。
684

被折叠的 条评论
为什么被折叠?



