当前位置:网站首页>C杂讲 浅拷贝 与 深拷贝
C杂讲 浅拷贝 与 深拷贝
2022-07-06 09:04:00 【Bright-SKY】
目录
知识点1【知识点的引入】
1、当结构体中存在指针成员变量时,进行结构体变量拷贝操作时,存在浅拷贝与深拷贝差别问题。
即:浅拷贝时,拷贝后两个结构体变量中指针成员变量指向同一个地址
深拷贝时,拷贝后两个结构体变量中指针成员变量指向不同地址
typedef struct
{
int num;
char *name;//指针变量作为 结构体的成员
}DATA;
void test01()
{
DATA data={100,"hehehehaha"};
printf("%d\n",sizeof(DATA));//8字节
printf("num = %d\n",data.num);
//指针变量作为结构体的成员 保存的是空间的地址
printf("name = %s\n",data.name);
}
2、指针变量 作为结构体的成员 操作前 必须有合法的空间
void test02()
{
DATA data;
printf("%d\n",sizeof(DATA));
printf("num = %d\n",data.num);
//指针变量 作为结构体的成员 操作前 必须有合法的空间
//data.name = "hehe";
//给name 事先申请 一块 堆区空间
data.name = (char *)calloc(1,10);
strcpy(data.name,"hahaha");
printf("name = %s\n",data.name);
//如果name指向堆区空间 一定要记得释放
if(data.name != NULL)
{
free(data.name);
data.name = NULL;
}
}
原理图分析:
3、指针变量 作为结构体的成员 结构体变量间的赋值操作 容易导致“浅拷贝”发生
void test03()
{
DATA data1;
DATA data2;
data1.num = 100;
data1.name = (char *)calloc(1,10);
strcpy(data1.name,"my data");
printf("data1:num = %d, name = %s\n",data1.num, data1.name);
//指针变量 作为结构体的成员 结构体变量间的赋值操作 容易导致“浅拷贝”发生
data2 = data1;//“浅拷贝”
printf("data2: num = %d, name = %s\n",data2.num, data2.name);
if(data1.name != NULL)
{
free(data1.name);
data1.name = NULL;
}
if(data2.name != NULL)
{
free(data2.name);
data2.name = NULL;
}
}
运行结果 出现段错误
知识点2【深拷贝】
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
int num;
char *name;
}DATA;
void test01()
{
DATA data1;
DATA data2;
data1.num = 100;
data1.name = (char *)calloc(1,12);
strcpy(data1.name, "my data");
data2.num = data1.num;
//为结构体变量 申请 独立的空间
data2.name = (char *)calloc(1,12);
strcpy(data2.name, data1.name);
printf("data1:num = %d, name=%s\n", data1.num, data1.name);
printf("data2:num = %d, name=%s\n", data2.num, data2.name);
if(data1.name != NULL)
{
free(data1.name);
data1.name = NULL;
}
if(data2.name != NULL)
{
free(data2.name);
data2.name = NULL;
}
}
int main(int argc,char *argv[])
{
test01();
return 0;
}
运行结果:
知识点3【总结】
前提就是指针变量 作为 结构体的成员
浅拷贝:两个结构体变量 中的 指针成员 指向 同一块堆区空间。
深拷贝:两个结构体变量 中的 指针成员 指向 各自的堆区空间。
边栏推荐
猜你喜欢
tn-c为何不可用2p断路器?
Hero League rotation map automatic rotation
What you have to know about network IO model
Some thoughts on the study of 51 single chip microcomputer
Release of the sample chapter of "uncover the secrets of asp.net core 6 framework" [200 pages /5 chapters]
Oom happened. Do you know the reason and how to solve it?
手把手教您怎么编写第一个单片机程序
Detailed explanation of cookies and sessions
Some thoughts on the study of 51 single chip microcomputer
max-flow min-cut
随机推荐
What you have to know about network IO model
Several silly built-in functions about relative path / absolute path operation in CAPL script
大学C语言入门到底怎么学才可以走捷径
Design and implementation of online snack sales system based on b/s (attached: source code paper SQL file)
May brush question 02 - string
max-flow min-cut
CANoe CAPL文件操作目录合集
在CANoe中通過Panel面板控制Test Module 運行(初級)
Mapreduce实例(十):ChainMapReduce
O & M, let go of monitoring - let go of yourself
Interview shock 62: what are the precautions for group by?
Why data Tiering
解决小文件处过多
Hard core! One configuration center for 8 classes!
发生OOM了,你知道是什么原因吗,又该怎么解决呢?
CAPL 脚本对.ini 配置文件的高阶操作
A wave of open source notebooks is coming
Function description of shell command parser
VH6501学习系列文章
May brush question 27 - figure