首页 > 解决方案 > 在 C 中复制包含指针的结构 - 它是如何工作的?

问题描述

我得到了一个任务,要告诉我打印的内容是什么,但我什么都不懂。
为什么在它的行中//***OUTPUT #1***打印

first array is:  
0 1 2 30

并不是

first array is:  
0 1 2 3

如果他们T2 = T1这样写,则意味着他们指向同一个地址,并且对 的所有更改都T2将与对T1?的更改相同。

我认为不是那样的,因为它们是 2 个变量,并且T2会将数据复制到 T1 中,但会复制到新地址中。

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct myArray
{
    int *iArr;
    int size;
    char name[10];
}MyArray;

void printArray(MyArray T);

int main()
{
    MyArray T1,T2;
    int i;
    T1.size = 4;
    T1.iArr = (int *) calloc(T1.size, sizeof(int));
    strcpy(T1.name, "first");
    for (i=0; i<T1.size;i++)
    {
        T1.iArr[i] = i;
    }
    printArray(T1);
    T2 = T1;
    T2.iArr[3] = T1.iArr[3]*10;
    T2.size=2;
    printArray(T1); //***OUTPUT #1***
    printArray(T2);
    strcpy(T2.name, "second");
    T2.iArr = (int *) calloc(T2.size, sizeof(int));
    for(i=0;i<T2.size;i++)
    {
        T2.iArr[i] = -i;
    }
    printArray(T1);
    printArray(T2);
    return 0;
}

void printArray(MyArray T)
{
    int i;
    printf("%s array is:\n",T.name);
    for(i=0;i<T.size;i++)
    {
        printf ("%d ",T.iArr[i]);
    }
    printf ("\n");
}

标签: arrayscstringstruct

解决方案


在这里,您将所有值从 T1 的成员复制到 T2,即所谓的“浅”复制。

T2 = T1;

这包括指针内部的地址,浅。即两者都引用相同的内存区域。
在从两者引用的单个内存中,您在此处写入的值是其中的 10 倍。

T2.iArr[3] = T1.iArr[3]*10;

在此之前和之后,两个指针都指向同一个指针,因此您将通过这两个指针读取“30”。你在这里做什么。

printArray(T1); //***OUTPUT #1***
printArray(T2);

对于没有表现出观察到的行为的“深层”副本,您必须创建指向内存的新副本(即做另一个calloc())。

所以:

如果他们写 T2 = T1,这意味着他们指向同一个地址,并且对 T2 所做的所有更改都将与对 T1 的更改相同?

对,就是这样。

我认为不是那样的,因为它们是 2 个变量,所以 T2 将复制 T1 中的数据,但复制到一个新地址

是(浅)和否(不深)。
是的,T1 中的所有值都被复制到 T2 内的新内存中,但两者中的指针都包含相同的值/地址。
所以不,他们指向的是相同的记忆,你最初从第一个获得的记忆calloc()

是的,这两个指针(位于不同的内存中)指向同一个内存。不,不是不同的动态分配的内存部分。

这不会改变,直到你这样做

T2.iArr = (int *) calloc(T2.size, sizeof(int));

你接近完成这里的深拷贝,虽然有不同的值

for(i=0;i<T2.size;i++)
{
    T2.iArr[i] = -i; // different values
  //T2.iArr[i] = T1.iArr[i]; // deep copy variant, keeping the "30"

}

推荐阅读