2011-05-23 117 views
11

这可能是一个非常基本的问题,但不知怎的,它让我受骗...当我编写测试代码时,它似乎工作,但生产中出现问题。结构深拷贝

// Header file 
#define length 100 
typedef struct testStr_t { 
    int a; 
    char b; 
    char t1[length]; 
    char t2[length]; 
} test; 

void populateTest(test*); 

// source file 
test test1; 
test test2; 
populateTest(&test1); 
test2 = test1; 

test2test1深拷贝?或者这里有陷阱吗?如果代码是用C编译器或C++编译器编译的,那么这很重要吗?

+7

没有真正在C系列与浅拷贝的任何概念++。一切都是价值,价值观只是被复制而已。 – jalf 2011-05-23 21:31:20

+0

@Cubbi:你为什么删除你的答案?这很好! – 2011-05-23 21:33:18

+4

@jalf:咦?绝对有一种深浅复制的概念。好的,不要用语言,而且如果你明智的话,并使用RAII;但尽管可以避免需要作出区分,但决不意味着没有。 – 2011-05-23 21:33:57

回答

10

深副本只能通过指针阻碍,所以你struct将在C正确地复制它会用C++的工作,以及除非你定义自己的operator=正确不副本。您只需要为指针类型定义operator=,因为指针的浅拷贝将复制指针但共享数据。

3

我的答案与C++有关。我只能猜测,它仍然适用于C.

这将是一个浅拷贝。

如果对象包含指针t1t2,每个都包含一些间接的,动态分配的内存块的位置,你需要深拷贝。

但是,对象包含实际数组时间的直接对象,所以对于浅拷贝来说你很好。

(它一定的误导性,这工作,但你不能手动分配给对象数组自己!)