让我们考虑我已经定义了一个像(注意:uint8
表示unsigned char
)的内存区域:
uint8 myMemoryArea[1024];
我有一个类似的结构:
typedef struct
{
uint8 * ptrToMyVar;
uint8 otherVar;
} myStruct_type;
我想将myMemoryArea
视为myStruct_type
的数组,所以我想对内存区域执行随机访问,例如:
myStruct_type * myPtrToStruct = (* myStruct_type)(&(myMemoryArea[ELEMENT_TO_ACCESS * sizeof(myStruct_type)]));
myPtrToStruct->otherVar = 2;
这台机器是否独立?我应该期待对齐或填充的麻烦吗?
我想只要我使用sizeof
填充就可以了。
我应该确保myMemoryArea
从可被sizeof(* char)
整除的地址开始 - 可能将其定义为指针数组吗?
答案 0 :(得分:2)
无法保证myMemoryArea
能够正确对齐。根据您的CPU和O / S和编译器,您可能会崩溃或访问未对齐的数据。 (另见:Solve the memory alignment in C interview question that stumped me)。
考虑如果在此上下文中声明变量会发生什么:
double d1;
uint8 c1;
uint8 myMemoryArea[1024];
uint8 c2;
douebl d2;
有充分的理由期望d1
正确对齐;如果不是,编译器会让你失败。没有理由期待c1
的任何异常处理;单个字节可以存储在任何对齐上。 myMemoryArea
数据也不必特别对齐;周围可能没有空间,很可能是在一个奇怪的地址。 c2
变量不需要特殊处理; d2
将正确对齐(数据中可能有6个字节的未使用空间。
如果myMemoryArea
处于奇数字节对齐状态,而您使用RISC计算机访问内存结构,则很可能会出现SIGBUS错误。在Intel计算机上,您可能会获得非常慢的访问权限。