C - 指针算术

标签 c pointers

我有:

char buffer[512 + 12];

我试图强制 buffer 对齐 16 个字节(意思是 - 零是最后 4 位)。 所以我尝试了:

buffer = (char*)(((uint32_t)buffer +12)) & ~0xF);

但是我得到了赋值中不兼容的类型

我猜这是因为 char[] 和 char* 不是同一类型。我该如何解决这个问题?

最佳答案

那么你需要添加 15 个字节,而不是 12 个,它应该是:

char _buffer[512 + 15];

char * const buffer = (char*)(((uintptr_t)_buffer + 15)) & ~0xF);

请注意,原始缓冲区地址无法修改,因此我们称未对齐缓冲区为_buffer。并初始化一个 const 对齐指针,buffer , 在 _buffer 中第一个对齐的地址.

以牺牲可移植性为代价,您还可以使用编译器扩展来更简单地做同样的事情,例如在 gcc 和 gcc 兼容的编译器中:

char buffer[512] __attribute__ ((aligned(16)));

关于C - 指针算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18426996/

相关文章:

c - 数组中唯一值的记录

c: printf ("%-16llu", my_var);

c - 如何在 Mac 的 C 中获取接收击键的应用程序的 id?

c - 从结构指针打印

c - 何时使用 NULL 以及何时在 C 的链表中使用 '\0'?

c - 二进制 + 的操作数无效(有 ‘double *’ 和 ‘double’ )

c++ - SDL_MapRGB,如何使用指向指针的指针获取屏幕->格式

当数据复制/扫描/读取到未初始化的指针时崩溃或 "segmentation fault"

c++ - 为什么 "pointer=pointer+i"得到了一种随机值

c++ - c++标准中有多少个头文件?