关于C中的结构体深复制和浅复制的问题[复制]

qyswt5oh  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(115)

此问题已在此处有答案

What is the difference between a deep copy and a shallow copy?(31个回答)
上个月关门了。
我现在正在自己完成6.S081。有一些代码我真的不明白

// Allocate process.
  if((np = allocproc()) == 0){
      return -1;
  }

  // Copy user memory from parent to child.
  if(uvmcopy(p->pagetable, np->pagetable, p->sz) < 0){
     freeproc(np);
     release(&np->lock);
     return -1;
  }
  np->sz = p->sz;

  // copy saved user registers.
  *(np->trapframe) = *(p->trapframe);

这些代码将创建一个新进程,并从其父进程分配内存。
我的问题是,当我问chatgpt和谷歌这行不是深复制,这是一个浅复制是正确的吗?或者这是一个深复制,chatgpt是错误的?

*(np->trapframe) = *(p->trapframe);
lh80um4z

lh80um4z1#

如果你想要深层拷贝(意味着结构中有指针成员),你必须写一个函数来做拷贝。

*(np->trapframe) = *(p->trapframe);

这将对所指出的成员进行浅复制。如果trapframe中有指针成员,指针将被复制,但不复制它们所指向的内容。
你分享的代码片段很可能是一个深度复制函数的一部分,在这个函数中,*(np->trapframe) = *(p->trapframe);只对一个成员进行浅复制。

8yparm6h

8yparm6h2#

如果没有任何上下文,您无法分辨这是一个“深”还是“浅”副本。
一般来说,“浅”复制意味着一个结构体可能有指针成员,如果你只是通过赋值来复制结构体,那么这些指针成员将不会被正确复制。而在结构体没有指针成员的情况下,通过赋值来复制它就可以了。
在这种情况下,如果不查看结构,就无法知道什么是合适的。至于ChatGPT,它是一个文本生成器/幻觉器-它对编程一无所知,它只是生成它认为你想听到的东西,如果必要的话,公然撒谎。

相关问题