Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C结构的对齐_C_Pointers_Memory Alignment_Word Boundaries - Fatal编程技术网

C结构的对齐

C结构的对齐,c,pointers,memory-alignment,word-boundaries,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) )

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

这样做安全吗

(struct something*) (data + 123) // ??&data [123]??
然后访问结构的成员。或者我应该做类似的事情

struct something record;
memcpy (&record, data + 123, sizeof (struct something) );
甚至是完全不同的东西


我的问题主要是出于动机,因为我对“内存对齐”、“单词边界”等有一些模糊的记忆。

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

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

这取决于具体情况


在某些现代CPU(如x86)上,访问未对齐的字进行读/写操作是可以的,并且没有性能损失,尽管某些特定指令可能需要对齐的操作数(如PPC上的CAS指令)。

非常感谢。我担心会这样,我会坚持使用
memcpy
。旁注:
data+123
&data[123]
&123[data]
之间有什么区别吗?还是仅仅是句法上的糖分?@Hyperboreus:就你的目的而言,这些表达之间没有区别。(我很想说没有,除非您可能需要括号来避免优先级问题;例如,
pointer-data+123
不同于
pointer-data[123]
,但是
pointer-(data+123)
将与后者相同。但是,为了确保即使在深奥的情况下也没有差异,我必须检查C标准,目前时间紧迫。)一方面注意:在arm上内置的
memcpy
在与未对齐的数据一起使用时经常会导致转储,因此,如果遇到内置的
memcpy
memmove
(并使用libc版本)问题(取决于编译器),您可能需要禁用它们。