char arr[512] = {0};
int *ptr = (int *)arr; // WRONG
// A bus error can be caused by unaligned memory access
printf("%d\n", *ptr);
另一方面:
malloc为您提供的块保证对齐以便它 可以保存任何类型的数据。
char *arr= malloc(512);
int *ptr = (int *)arr; // OK, arr is properly aligned for ptr
memset(arr, 0, 512);
printf("%d\n", *ptr);
这个假设是正确的还是我错过了什么?
答案 0 :(得分:3)
C标准保证malloc将返回适合最严格的基本类型的内存(例如uint64_t
)。如果您有更严格的要求,则必须使用aligned_alloc
或类似的东西。
7.22.3
如果分配成功,则返回指针,适当地对齐 它可以被分配给指向任何类型的对象的指针 基本对齐要求然后用来访问这样的 对象或分配的空间中的此类对象的数组(直到 空间明确解除分配)
关于aligned_alloc
:
void *aligned_alloc(size_t alignment, size_t size);
aligned_alloc函数为其对象分配空间 alignment由alignment指定,其大小由size指定, 而且其价值是不确定的。
就对齐而言,您的代码是正确的。我不是特别喜欢指针转换(char *
到int *
),但我认为它应该可以正常工作。