严格别名会阻止我们使用不兼容的类型访问相同的内存位置.
int* i = malloc( sizeof( int ) ) ; //assuming sizeof( int ) >= sizeof( float )
*i = 123 ;
float* f = ( float* )i ;
*f = 3.14f ;
Run Code Online (Sandbox Code Playgroud)
根据C标准,这将是非法的,因为编译器"知道" 左值int不能访问float.
如果我使用该指针指向正确的内存,如下所示:
int* i = malloc( sizeof( int ) + sizeof( float ) + MAX_PAD ) ;
*i = 456 ;
Run Code Online (Sandbox Code Playgroud)
首先,我为内存分配内存int,float最后一部分是允许float存储在对齐地址的内存.float需要在4的倍数上对齐,MAX_PAD通常是16个字节中的8个,具体取决于系统.在任何情况下,MAX_PAD足够大,所以float可以正确对齐.
然后,我写的int进入i,到目前为止,一切顺利.
float* …Run Code Online (Sandbox Code Playgroud)