在标准C库中,有两种不同的功能可用于复制数据区域,memmove()
用于重叠的存储区域,memcpy()
用于不相交的,非重叠的存储区域。
C标准对结构分配有何看法?
struct thing myThing = {0};
struct thing *pmyThing = &myThing;
myThing = *pmyThing; // assign myThing to itself through a pointer dereference.
就涉及重叠的存储区域而言,结构分配是否遵循memmove()
或memcpy()
的规则或它自己的规则?
答案 0 :(得分:6)
C标准的第6.5.16.1节(“简单赋值”)(从N1548草案中读取)规定:
在简单赋值(
=
)中,将右操作数的值转换为赋值表达式的类型,并替换存储在由左操作数指定的对象中的值。如果从另一个对象中读取的对象中存储的值以任何方式与第一个对象的存储重叠,则该重叠应是准确的,并且两个对象应具有兼容类型的合格或不合格版本;否则,行为是不确定的。
C标准没有指定如何编译器实现简单分配。但是,如果源和目标之间的重叠是准确的并且类型兼容,则允许重叠。自我分配(无论是否通过指针)都满足此要求,因此行为是明确定义的。