面试题答案
一键面试- 内存布局的看待方式:
- 在32位系统默认对齐方式下,
myStruct
结构体的内存布局如下:int
类型的a
占4字节,char
类型的b
占1字节,由于默认对齐(通常按4字节对齐),b
后面会填充3字节,short
类型的c
占2字节。所以myStruct
结构体总共占4 + 1 + 3 + 2 = 10字节。 - 当把
myStruct *
类型的指针ptr
强制转换为char *
类型的指针charPtr
时,charPtr
将把myStruct
结构体所占据的内存空间看作是连续的字节序列,而不再考虑原来结构体成员的类型和对齐方式。
- 在32位系统默认对齐方式下,
- 通过
charPtr
访问内存可能带来的问题:- 内存对齐问题:如果直接通过
charPtr
去访问类似int
或short
类型的数据,因为charPtr
以字节为单位访问,可能无法满足这些数据类型对内存对齐的要求。例如,在某些硬件平台上,非对齐的int
访问会导致硬件异常或性能下降。 - 数据截断问题:
charPtr
按字节读取数据。如果想通过charPtr
获取int
类型的a
,直接读取4个字节后再转换为int
,可能会因为字节顺序(大端或小端)问题导致数据截断或错误解析。同样对于short
类型的c
,按字节读取并转换时也可能出现类似问题。
- 内存对齐问题:如果直接通过
- 安全地通过
charPtr
访问myStruct
中各个成员的操作:- 对于
int
类型的a
:
这里先将int aValue = *(int*)(charPtr);
charPtr
重新转换回int *
类型的指针,然后解引用获取a
的值。这样做确保了对a
的访问符合int
类型的内存对齐要求。 - 对于
char
类型的b
:
因为char bValue = *(char*)(charPtr + sizeof(int));
a
占4字节,所以偏移4字节后再转换为char *
类型指针并解引用,获取b
的值。 - 对于
short
类型的c
:
由于short cValue = *(short*)(charPtr + sizeof(int) + 1 + 3);
a
占4字节,b
占1字节及后面填充3字节,总共偏移8字节,再转换为short *
类型指针并解引用,获取c
的值。这样的操作保证了对各个成员的访问在内存对齐和数据类型转换上的正确性。
- 对于