当我将内存区域视为结构数组时的对齐注意事项

时间:2013-03-27 09:44:17

标签: c arrays struct alignment

让我们考虑我已经定义了一个像(注意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)整除的地址开始 - 可能将其定义为指针数组吗?

1 个答案:

答案 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计算机上,您可能会获得非常慢的访问权限。