如果两个指针指向同一个 struct 变量,是否定义了将一个取消引用的指针分配给另一个指针的行为?
struct Struct {
int member;
};
int main() {
struct Struct s, *p1, *p2;
s.member = 1234;
p1 = p2 = &s;
*p1 = *p2; // is this allowed?
}
我之所以这样问,主要是因为在this SO post和this SO post中,许多答案都指出 struct 赋值或多或少等同于memcpy
,一些编译器甚至会为赋值语句生成memcpy
调用.然而,当内存位置重叠时,memcpy
没有定义,这就引出了一个问题:它是为赋值而定义的吗?
这似乎符合预期,但我想知道C标准是否对此有什么要说的.是否需要添加一张简单的支票
if (p1 != p2) *p1 = *p2;
还是用memmove
个
仅供参考,这是在我用C实现我自己的槽映射(如描述here)时出现的.当从容器中删除元素时,数组末尾的元素被复制到已删除的位置,以保持所有内容连续.如果被删除的元素在数组的末尾,它将被复制到它自己(不是特别重要,因为该元素被认为是被删除的,但无论如何让我感到好奇).