c - 将数组的起始地址对齐为 32 位的倍数?

标签 c arrays memory-management global

我有一个全局的 char 数组类型。我希望起始地址与 32 位对齐。当我检查映射文件中的虚拟地址时,它是xxxxxx56H。如何将起始地址对齐为32bit的倍数。我需要通用解决方案而不是依赖于编译器的解决方案。我已经尝试过

#pragma pack(32)
char array[223];
#pragma pack

但不工作。

P.S:为了与32位对齐,地址的最后两位应该是0。

最佳答案

打包是完全不相关的事情。要对齐静态变量或结构成员(相对于结构开始),请使用标准 _Alignas specifier .

如果您需要平台上的最大对齐方式(即适合任何类型的对齐方式),请使用max_align_t,对于特定的字节对齐方式,只需将对齐方式指定为常量表达式即可:

_Alignas(32 / CHAR_BIT) char a[10];

(如果除法有余数,这会导致问题;您真的指的是 32 位 还是 32 字节?标准不保证一个字节有 8 位。)

如果您打算将数组转换为任何其他类型,您仍然会通过违反有效类型(也称为严格别名)规则来调用未定义的行为。为数组使用正确的类型,并使用该类型的较大对齐方式或您想要的任何内容,例如条件运算符:

Alignas(_Alignof(int) > 8 ? _Alignof(int) : 8) int a[10];

关于c - 将数组的起始地址对齐为 32 位的倍数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45170533/

相关文章:

java - 在带有 && 运算符的 if 语句中使用 char 数组和 boolean 数组

Javascript多数组操作

c# - C++ 混合模式应用程序中的内存管理

c - 如何在 struct 内部和 main 外部分配内存?

c - 此程序中的意外输出

c - 将 char 数组中的值传递给 c 中的 BoS 函数

c - 为什么我不能将此指针设置为 NULL?

c - 如何在不包含 stdio.h 的情况下使用 scanf()

c - 使用 qsort 对两个数组进行排序?

c - 用户空间中的物理内存管理?