面试题答案
一键面试- 通过指针安全访问结构体成员
b
: 假设p
已经正确初始化指向myStruct
类型的结构体变量。可以使用->
运算符来访问结构体成员。例如:struct { int a; char b; float c; } myStruct; struct { int a; char b; float c; } *p = &myStruct; char valueOfB = p->b;
- 指针偏移导致的安全性问题:
- 问题描述:结构体在内存中存储时,由于成员类型不同,可能存在内存对齐的情况。如果错误地进行指针偏移计算,比如直接将
p
当作普通char*
指针进行偏移,可能会访问到错误的内存位置。例如:
// 错误示例 struct { int a; char b; float c; } myStruct; struct { int a; char b; float c; } *p = &myStruct; char *wrongPtr = (char*)p + sizeof(int); // 错误的偏移,没有考虑内存对齐 char wrongValue = *wrongPtr; // 可能访问到错误的内存
- 危害:这可能导致读取到无效数据,或者在写入时覆盖到不应该修改的内存区域,从而引发程序崩溃、数据损坏等问题。
- 问题描述:结构体在内存中存储时,由于成员类型不同,可能存在内存对齐的情况。如果错误地进行指针偏移计算,比如直接将
- 避免方法:
- 使用结构体指针和
->
运算符来访问成员,这样编译器会根据结构体定义自动处理正确的偏移。如上述正确访问b
的示例。 - 不要手动进行指针偏移计算,除非你对结构体的内存布局和内存对齐规则有非常清楚的了解。如果确实需要手动偏移,要使用
offsetof
宏来获取成员在结构体中的偏移量。例如:
这样通过#include <stddef.h> struct { int a; char b; float c; } myStruct; struct { int a; char b; float c; } *p = &myStruct; char *correctPtr = (char*)p + offsetof(struct { int a; char b; float c; }, b); char correctValue = *correctPtr;
offsetof
宏获取的偏移量是准确的,能避免因手动计算偏移量错误而导致的安全性问题。 - 使用结构体指针和