arrays - 在 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");
}
解决方案
在这里,您将所有值从 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"
}
推荐阅读
- msbuild - Msbuild:根据文件内容过滤项目组
- c# - 两个属性相同时的LINQ groupby
- menuitem - 在android studio中调整appbar项目
- typescript - 基于其他接口创建对象/接口
- html - 图像和文本之间的空白即使 0 填充也不起作用
- scala - 使用错误的 Scala 版本编译插件
- python - 具有分类数据的一类支持向量机
- javascript - 如何总结总json
- postgresql - JBPM - 'Processinstacelog' 表在 Psotgres DB 中将状态显示为整数而不是文本数据类型
- ios - CollectionView iOS中的多个标签和ImageView