相关疑难解决方法(0)

严格的别名规则和'char*'指针

什么是严格别名规则的接受答案提到您可以使用char *别名而不是其他方式.

这对我来说没有意义 - 如果我们有两个指针,一个是指向同一个位置的类型char *,另一个struct something *指向同一个位置,那么第一个别名可能是第二个但第二个不是第一个别名吗?

c c++ strict-aliasing

20
推荐指数
2
解决办法
4115
查看次数

严格的别名和内存位置

严格别名会阻止我们使用不兼容的类型访问相同的内存位置.

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)

c memory standards strict-aliasing

15
推荐指数
2
解决办法
1985
查看次数

标签 统计

c ×2

strict-aliasing ×2

c++ ×1

memory ×1

standards ×1