C语言中结构体自赋值(含指针指向自身)是否有明确定义?
C语言中结构体自赋值的定义性分析
结论:结构体的自赋值操作在C语言标准中具有明确定义,执行后结果完全确定
- C语言标准对结构体赋值操作的语义有清晰规定:结构体赋值本质是逐成员的浅拷贝。执行
foo = *p_foo时,会先将右操作数*p_foo的完整值读取到一个临时存储对象中,再把这个临时对象的内容逐成员复制到左操作数foo中。 - 这个流程不依赖结构体的大小或复杂度——哪怕是示例中包含4096字节数组的大结构体,读取操作也会在写入操作启动前完成,不会出现“边读边写”导致的未定义行为。
- 针对你给出的代码:当
p_foo指向foo本身时,foo = *p_foo执行后,foo的值会保持不变。因为临时对象是foo当前值的完整副本,将副本拷贝回原对象自然不会改变其内容。 - 补充说明:如果结构体包含指针成员,自赋值的行为依然明确,但只会拷贝指针本身(浅拷贝),不会递归复制指针指向的内存内容——这属于结构体赋值的正常特性,并非未定义行为。
- 你提到的“无法进行编译器优化”不影响结果的确定性,因为标准已经明确了操作的语义,无论是否优化,执行结果都必须符合标准规定。
内容的提问来源于stack exchange,提问作者DonGar
相关产品推荐
相关产品推荐

