c - C结构的对齐

标签 c pointers memory-alignment word-boundaries

我在一个文件中有一些二进制数据,并将该文件加载到内存中的char* data。现在我知道例如在偏移量 123 处开始一个 struct something

这样做安全吗

(struct something*) (data + 123) // ??&data [123]??

然后访问结构的成员。或者我应该做类似的事情

struct something record;
memcpy (&record, data + 123, sizeof (struct something) );

或者甚至完全不同的东西?

我的问题主要是有动机的,因为我对“内存对齐”、“字边界”等有一些模糊的内存……

最佳答案

是的,您应该使用 memcpy,而不是指针转换,这正是您讨论的原因:对齐。转换指针是不安全的。如果对齐错误,则 C 标准不保证使用结果指针时的行为。

在某些情况下,另一种方法是将数据直接读入对象。

关于c - C结构的对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21395270/

相关文章:

c++ - 在什么情况下应该使用匿名枚举?

c - C语言中如何将int转为float?

c - 二维数组打印错误

c - 为什么编译器将此变量初始化为错误的值?这是对齐问题吗?

c++ - 为SIMD分配内存对齐的缓冲区; | 16如何给出16的奇数倍,为什么呢?

c++ - “CObject::CObject”:无法访问类 'CObject' d:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxcoll.h 中声明的私有(private)成员

c - glReadPixels()无法获取片段着色器输出的A值。

pointers - 符号链接(symbolic link)是指针吗? (或相反)

malloc() 可以用来定义数组的大小吗?

optimization - x86 中对齐 16 字节边界意味着什么