malloc返回的内存地址是否总是可以通过指向另一种类型的指针互换?

时间:2015-01-23 10:20:53

标签: c alignment 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);

这个假设是正确的还是我错过了什么?

1 个答案:

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