C语言深拷贝和浅拷贝问题

2023-12-21 18:40:48

目前查到的资料,发现只有在结构体带指针,在拷贝结构体时(要用memcpy)时会出现。有些地方用结构体赋值代替memcpy结构体,结果是一样的,但是,个人认为,赋值不叫拷贝,应该就叫赋值,否则浅拷贝情况太多了。

下面这篇讲memcpy的部分应该是正解:

memset()函数与memcpy()函数知识总结---结构体中有指针变量_memcpy内存泄漏-CSDN博客

这里结构体里面的指针是指向了动态分配内存。其实就算是指向任何一个变量或者数组,拷贝结构体时都是浅拷贝,即,拷贝结构体的指针本身(值)被拷贝,也就是其指向被拷贝结构体指针指向的值,而不指向原来指向的值,原来指向的值就和这个指针脱离了。

所以这在释放内存时会出问题,会导致原来拷贝结构体指针指向的动态内存没有指针指向它,也基本就无法释放了,后面如果涉及动态内存申请和释放,程序会报错。而如果再按照常规流程,依次释放这两个结构体指向动态内存的指针,则导致同一块内存被释放两次,也会报错。

struct stTest
{
	int a;
	int *p;
};

int main()
{
	stTest stTT1, stTT2;

	stTT1.a = 1;
	int x[10] = { 0 };

	stTT1.p = x;
	memcpy(&stTT2, &stTT1, sizeof(stTT1)); // 拷贝结构体
	return 0;
}

在依次将断点打在

文章来源:https://blog.csdn.net/weixin_40194697/article/details/135135582
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。