【发布时间】:2012-12-05 12:14:35
【问题描述】:
我有以下结构:
struct foo
{
int a;
char b;
};
它存储在内存中,指向它的指针可以是非对齐的(奇数地址)。
那么,这样安全吗?:
const struct foo a = *((struct foo*)char_ptr);
我很担心,因为源结构的整数成员可能位于奇数地址。在某些系统中,从奇数地址读取(多字节)整数会导致问题。
编辑:
为了避免对const 的使用发表离题评论,我确实从代码中删除了const。 (我从不将 const 指针转换为非 const 指针,即使在这种情况下它也不应该引起任何问题)
以及更多关于问题背景的信息:
这种结构是协议帧的一部分。它可以在框架内的任何偏移处。在实际代码中,结构具有__attribute__((packed)) 属性。但这可能不会改变答案?
无论如何,我可以使用memcopy 和非常量a 来解决问题。但我想使用 assingment,因为它似乎是更优雅的方式(如果它是安全的)。
【问题讨论】:
-
编译器应该处理它。如果一个变量可以正常访问,就可以通过指针访问。
-
@User1 - 我会回到你的教科书阅读关键字
const -
^^ 正确指出... LHS 上的 const 不允许 RHS 上的变量。
-
@anishsane 不明白你的意思。始终允许使用“变量”值初始化 const。如果这发生在声明中(如上所述),那是完全合法的。
-
我希望打包属性能够改变行为。由于结构是打包的,编译器必须预期成员可能会奇怪地对齐,并且它应该生成代码来处理它。不过,我没有明确的文档。
标签: c