【发布时间】:2013-03-13 15:06:55
【问题描述】:
我想测试在 C 中访问一个未对齐的结构成员是否可以,请看代码
#include <stdio.h>
#pragma pack(1) /* force 1 byte alignment */
/* either member b or member d is mis-aligned */
typedef struct
{
int b;
unsigned char c;
unsigned int d;
}A ;
int main(int argc, char *argv[])
{
A _a = {0};
unsigned int *p = NULL;
unsigned int *q = NULL;
printf("addr of _a : 0x%08x, size of _a : %u\n", &_a, sizeof(_a));
p = (unsigned int*)(&_a.b);
q = (unsigned int*)(&_a.d);
/* should this fail ? */
(*p)++ , (*q)++;
return 0;
}
假设由于内存访问未对齐导致的异常导致程序崩溃,但事实证明它运行得很好,在Linux 3.6.11(GCC 4.7.2),WinXP(MingW)中测试过, codepad 在线编译器(http://codepad.org/yOoc8ACG)
请解释结果,我猜操作系统已经做了一些事情来保存程序,仍然怀疑它是否可以在 VxWorks 或其他一些操作系统中运行
注意:代码在基于 Intel 的机器上运行!
提前致谢!
【问题讨论】:
-
如果你在增加 p 和 q 后尝试将它们传递给另一个函数会发生什么?或者尝试访问这些位置的内存?
-
行为未定义;根据编译器和体系结构,它可能会崩溃、给出不好的结果或“按预期”工作。见this question 和answer。
-
一个小问题:最好避免定义以下划线开头的标识符。有些保留给实现用于所有目的,有些保留在文件范围内。
标签: c compiler-construction operating-system access-violation memory-alignment