相关疑难解决方法(0)

memset编写的对象的有效类型是什么?

代码1:

unsigned int *p = malloc(sizeof *p);
memset(p, 0x55, sizeof *p);

unsigned int u = *p;
Run Code Online (Sandbox Code Playgroud)

代码2:

void *d = malloc(50);
*(double *)d = 1.23;
memset(d, 0x55, 50);

unsigned int u = *(unsigned int *)d;
Run Code Online (Sandbox Code Playgroud)

在每种情况下,memset对malloc空间中对象的有效类型有什么影响; 那么初始化u正确还是严格的别名违规?

有效类型的定义(C11 6.5/6)是:

用于访问其存储值的对象的有效类型是对象的声明类型(如果有).如果通过具有非字符类型的左值的值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该值的后续访问的有效类型储值.如果使用memcpy或将值复制到没有声明类型的对象中memmove,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是有效类型复制值的对象,如果有的话.对于没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型.

然而,目前还不清楚是否memset表现得像通过字符类型的左值或其他东西写作.memset(7.24.6.1)的描述并不是很有启发性:

memset函数将c的值(转换为a unsigned char)复制到s指向的对象的前n个字符中.

c strict-aliasing language-lawyer

23
推荐指数
1
解决办法
717
查看次数

标签 统计

c ×1

language-lawyer ×1

strict-aliasing ×1