此问题已在此处有答案:
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);
2条答案
按热度按时间lh80um4z1#
如果你想要深层拷贝(意味着结构中有指针成员),你必须写一个函数来做拷贝。
这将对所指出的成员进行浅复制。如果
trapframe
中有指针成员,指针将被复制,但不复制它们所指向的内容。你分享的代码片段很可能是一个深度复制函数的一部分,在这个函数中,
*(np->trapframe) = *(p->trapframe);
只对一个成员进行浅复制。8yparm6h2#
如果没有任何上下文,您无法分辨这是一个“深”还是“浅”副本。
一般来说,“浅”复制意味着一个结构体可能有指针成员,如果你只是通过赋值来复制结构体,那么这些指针成员将不会被正确复制。而在结构体没有指针成员的情况下,通过赋值来复制它就可以了。
在这种情况下,如果不查看结构,就无法知道什么是合适的。至于ChatGPT,它是一个文本生成器/幻觉器-它对编程一无所知,它只是生成它认为你想听到的东西,如果必要的话,公然撒谎。