将结构变量分配给自身(通过指针取消引用)定义的行为吗?

问题描述 投票:0回答:1

如果两个指针指向同一个结构变量,是否定义了将一个取消引用的指针分配给另一个指针的行为?

struct Struct {
    int member;
};

int main() {
    struct Struct s, *p1, *p2;
    s.member = 1234;
    p1 = p2 = &s;
    *p1 = *p2; // is this allowed?
}

我问这个问题主要是因为在this SO postthis SO post中,许多答案指出结构体赋值或多或少相当于

memcpy
,并且一些编译器甚至为赋值语句生成
memcpy
调用。然而,当内存位置重叠时,
memcpy
并没有被定义,这就引出了一个问题:它是为赋值而定义的吗?

这似乎符合预期,但我想知道 C 标准是否对此有任何规定。是否需要添加一个简单的检查

if (p1 != p2) *p1 = *p2;

或使用

memmove
代替?


仅供参考,当我在 C 中实现我自己的插槽映射(如here所述)时,就出现了这个问题。从容器中删除元素时,数组末尾的元素将被复制到删除的位置以保持所有内容连续。在被删除的元素位于数组末尾的情况下,它将被复制到自身(不是非常重要,因为该元素被认为是被删除的,但无论如何让我很好奇)。

c pointers struct memcpy
1个回答
0
投票
*p1 = *p2; // is this allowed?

是的,可以,而且效率很高。

struct
union
是可分配的,并且正在复制整个结构或联合。

© www.soinside.com 2019 - 2024. All rights reserved.