【问题标题】:Copy(Not shallow or Deep) for structure in C/C++/Java equivalent. Copy to variable which is pointing to exactly the same memory for all members复制(非浅或深)C/C++/Java 等效结构。复制到指向所有成员完全相同的内存的变量
【发布时间】:2014-11-30 14:08:32
【问题描述】:

在 C 中复制结构的变量(具有指向某个变量的指针,例如浮点数和普通变量整数)。不是浅拷贝或深拷贝。但复制到一个指向完全相同内存的变量中。

考虑这段代码:

typedef struct {
    char *name;
    int value;
} Node;

void main()
{
    Node n1, n2, n3;

    char name[] = "This is the name";

    n1 = (Node){ name, 1337 };
    // HERE  n2 and n1 will contain name pointing to same memory location
    // But for value, they will have different memory location
    n2 = n1; 

    // Here n1 and n3 are referring to different memory locations for both name and value
    n3.value = n1.value;
    n3.name = strdup(n1.name); 

}

但我想要一些副本,它指向名称和值的相同内存位置。

在 C 或等效的 Java 代码或 C++ 中是否有方法? 如果是其他语言,请举出你自己的例子。

【问题讨论】:

  • 如果你想要一些 points 指向某个内存的东西,请使用 pointer :-)
  • 你必须进行要么浅拷贝或深拷贝,你不能什么都不做(那么你实际上并没有拷贝任何东西)。如果你只是复制指针(即pointer1 = pointer2),那么你就有了浅拷贝。现在,通过您的strdup 电话,您可以进行深度复制。如果您只是创建一个指针或对另一个结构的引用,那么您实际上根本不是在复制。
  • 您使用的是什么语言?您为该问题标记的三种语言是不同且独立的,并且在复制时具有不同的概念。
  • @JoachimPileborg 是的,你是对的。我了解这 3 种语言,因此我只欢迎基于这 3 种语言的回复。

标签: java c++ c pointers memory


【解决方案1】:

当你说,

Node n1, n2, n3;

编译器为堆栈中的“名称”和“值”创建不同的记忆。 由于'name'是一个指针,它指向的内存是根据你的意愿复制的,而不是变量'name'。因此,n1、n2 和 n3 的“名称”和“值”都不同。

即使 assignment(n2=n1) 在 n1 和 n2 中为“name”提供相同的内存位置,但“name”指向的内存将是相同的。

说到你的问题,这可以通过使用vz0所说的引用和指针来实现

【讨论】:

    【解决方案2】:

    在 C++ 中,您可以使用引用:

    Node n1 = {name, 31337};
    Node& n2 = n1;
    

    和指针:

    Node n1 = {name, 31337};
    Node* n2 = &n1;
    

    在这两种情况下,n1n2 的字段 value 位于同一内存地址上。

    在Java中只是变量名赋值;

    Node n1 = new Node(Name, 31337);
    Node n2 = n1;
    

    变量n1n2 是对同一个对象的引用,其成员完全相同。

    【讨论】:

    • 对不起,我有一段时间没学过 C++,但我怀疑 Node n1 = (Node){name, 31337}; 不是有效的 C++?
    • 不,当前标准 (C++11) 有 大括号初始化,这就是这里使用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2021-02-11
    相关资源
    最近更新 更多