我收到警告"施法增加了目标类型所需的对齐"同时为ARM编译以下代码。
char data[2] = "aa";
int *ptr = (int *)(data);
据我所知,char的对齐要求是1个字节,int的对齐要求是4个字节,因此是警告。
我尝试使用aligned属性更改char的对齐方式。
char data[2] __attribute__((aligned (4)));
memcpy(data, "aa", 2);
int *ptr = (int *)(data);
但警告并没有消失。
我的问题是
为什么警告没有消失?
由于ARM为未对齐的访问生成硬件异常,我想确保不会发生对齐问题。有没有其他方法来编写此代码,以便不会出现对齐问题?
顺便说一句,当我打印 alignof (数据)时,它会打印4,这意味着数据的对齐方式会发生变化。
我使用的是gcc 4.4.1版。即使使用对齐属性更改了对齐,gcc是否可能发出警告?
答案 0 :(得分:4)
我不太明白你为什么要这样做...但问题是字符串文字“aa”没有存储在对齐的地址。编译器可能完全优化了变量data
,因此只将代码视为int* ptr = (int*)"aa";
,然后给出错位警告。摆弄data
变量的任何数量都不会改变文字“aa”的对齐方式。
为了避免在未对齐的地址上分配文字,您必须调整字符串文字在编译器设置中的存储方式,这可能不是一个好主意。
另请注意,指向指向字符串文字的非常量数据是没有意义的。
所以你的代码是无稽之谈。如果您仍然因为未知的原因而坚持使用指向字符串文字的int指针,那么我会做一些解决方法,例如:
typedef union
{
char arr[3];
int dummy;
} data_t;
const data_t my_literal = { .arr="aa" };
const int* strange_pointer = (const int*)&my_literal;