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 * ),但我认为它应该可以正常工作。