Cast 增加了目标类型所需的对齐方式

Jak*_*ake 6 c arm

我正在 ARM 上编程,并有以下代码片段(C 语言):

struct data {
   int x;
   char y[640];
};
unsigned int offset = 819202;
char *buf; // buf is assigned an address elsewhere in the code
struct data * testdata = (struct data *)(buf + offset) 
Run Code Online (Sandbox Code Playgroud)

我收到以下编译错误:

错误:强制转换增加了目标类型所需的对齐方式 [-Werror=cast-align]

testdata指针需要指向包含类型数据数组的内存部分struct data。所以我需要一个指针,以便稍后我可以将索引应用于testdata. 偏移量是硬编码在程序中的。buf作为共享内存从另一个进程接收。

例如,稍后在代码中我有:

testdata[index].x = 100;
Run Code Online (Sandbox Code Playgroud)

我看过一些关于 SO 的例子,但我不确定处理这个问题的正确方法是什么。有什么建议 ?

dbu*_*ush 2

cast-align当您尝试从具有较小对齐方式的类型转换为具有较大对齐方式的类型时,会触发该警告。在这种情况下,您从char具有对齐方式1的a和具有对齐方式4的a struct data(因为它包含一个int)得到a(假设aint是4个字节)。

不要使用指向字符数组的结构体指针,而是使用memcpy从缓冲区复制到结构体实例中。

struct data testdata;
memcpy(&testdata, buf + offset, sizeof(testdata));
Run Code Online (Sandbox Code Playgroud)

  • @Jake如果您需要修改缓冲区中的内容,请首先将“memcpy”添加到结构中,进行更改,然后返回“memcpy”。这是确保您不会违反对齐要求的唯一方法。 (2认同)