malloc返回的内存地址是否总是可以通过指向另一种类型的指针互换?
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);
这个假设是正确的还是我错过了什么?
C标准保证malloc将返回适合最严格基本类型的内存(例如uint64_t
)。 如果您有更严格的要求,您必须使用aligned_alloc
或类似的东西。
7.22.3
如果分配成功,则返回指针,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针 ,然后用于在分配的空间中访问此类对象或此类对象的数组(直到空间被明确释放)
关于aligned_alloc
:
void *aligned_alloc(size_t alignment, size_t size);
aligned_alloc函数为对象分配空间,该对象的对齐方式由alignment指定,其大小由size指定,其值是不确定的。
就对齐而言,您的代码是正确的。 我不是特别喜欢指针转换( char *
to int *
),但我认为它应该可以正常工作。