【发布时间】:2023-01-09 18:15:56
【问题描述】:
我最近了解到,取消引用未针对特定对象 (uint32_t* foo = (uint32_t*)7; *foo = 5;) 对齐的指针实际上是未定义的行为:
C11 第 6.2.8 节:对象对齐:
完整的对象类型具有对齐要求,其中 对该类型的对象可能存在的地址的限制 分配。对齐是实现定义的整数值 表示连续地址之间的字节数 可以分配给定的对象。对象类型强制对齐 对该类型的每个对象的要求:可以是更严格的对齐 使用 _Alignas 关键字请求。
好的,非常有趣。但是 malloc 似乎根本不关心对齐:
7.22.3.4 malloc 函数
概要
#include <stdlib.h> void *malloc(size_t size);描述
malloc 函数为大小为的对象分配空间 由大小指定,其值不确定。退货
malloc 函数返回空指针或指向 分配的空间。
因此:是否真的没有机会做类似的事情
uint32_t* a = malloc(10*sizeof(uint32_t)); *a = 7;调用未定义的行为?毕竟,我们无法保证 malloc 的返回值与任何内容对齐。
【问题讨论】:
-
不,
*alloc函数返回与最大可能对象(通常为 64 或 128 位)对齐的内存。
标签: c malloc alignment language-lawyer