memset()函数与memcpy()函数知识总结---结构体中有指针变量

memset()函数与memcpy()函数知识总结—结构体中有指针变量

当自定义结构体中指针成员时,在使用memset()函数和memcpy()函数时需要十分小心,稍不留神就会产生错误。

memcpy()函数

1.直接使用memcpy()函数复制结构体,是完成的成员变量拷贝,即stTT1.p的值(其实就是分配的地址)会赋值给stTT2.p。若对stTT2.p分配了空间,拷贝后这段空间的地址被覆盖,会导致内存泄漏,同时在释放时有重复释放的风险。
程序示例

#include "pch.h"
#include <iostream>
struct stTest
{
  int a;
  int * p;
};

int main()
{
  stTest stTT1, stTT2;
  stTT1.p = (int *)malloc(sizeof(int) * 100);
  stTT2.p = (int *)malloc(sizeof(int) * 100);//注释掉也能运行
  	memset(stTT1.p, 0, sizeof(int) * 100);
  	memset(stTT2.p, 0, sizeof(int) * 100);//注释掉也能运行
  	for (int i = 0; i < 100; i++)
  	{
  		stTT1.p[i] = 2 * i + 1;
  	}
  	memcpy(&stTT2, &stTT1, sizeof(stTest));
  	for (int i = 0; i < 100; i++)
  	{
  		stTT2.p[i] = stTT2.p[i]+1;
  		std::cout << stTT2.p[i] << "\n";
  	}
  	for (int i = 0; i < 100; i++)
  	{
  		std::cout << stTT1.p[i] << "\n";
  	}
  	free(stTT1.p);
  	sTT1.p == nullptr;
  	free(stTT2.p) // stTT2.p已经被stTT1.p释放,重复释放,报错
}

复制前:
memset()函数与memcpy()函数知识总结---结构体中有指针变量_第1张图片
复制后:
memset()函数与memcpy()函数知识总结---结构体中有指针变量_第2张图片
2.若单独复制结构体中的指针对象,则拷贝的指针指向的内容,不会有问题,但需要对两对象指针分配空间。
程序示例

#include "pch.h"
#include <iostream>
struct stTest
{
	int a;
	int * p;
};

int main()
{
	stTest stTT1, stTT2;
	stTT1.p = (int *)malloc(sizeof(int) * 100);
	stTT2.p = (int *)malloc(sizeof(int) * 100);//不可注释
		memset(stTT1.p, 0, sizeof(int) * 100);
		memset(stTT2.p, 0, sizeof(int) * 100);
		for (int i = 0; i < 100; i++)
		{
			stTT1.p[i] = 2 * i + 1;
		}
		memcpy(stTT2.p, stTT1.p, sizeof(int)*100);
		for (int i = 0; i < 100; i++)
		{
			stTT2.p[i] = stTT2.p[i]+1;
			std::cout << stTT2.p[i] << "\n";
		}
		for (int i = 0; i < 100; i++)
		{
			std::cout << stTT1.p[i] << "\n";
		}
		free(stTT1.p);
		free(stTT2.p);
		return 0;
		}

复制前:
memset()函数与memcpy()函数知识总结---结构体中有指针变量_第3张图片
复制后:
memset()函数与memcpy()函数知识总结---结构体中有指针变量_第4张图片

memset()函数

当结构体里面存着指针对象时,直接使用memset()函数初始化结构体,指针对象会被初始化为0即空指针。
程序示例

memset(&stTT1, 0, sizeof(stTest));

memset()函数与memcpy()函数知识总结---结构体中有指针变量_第5张图片
操作是先对结构体中的指针对象分配空间,然后单独初始化该指针指向的空间,即可以认为带指针对象的结构体不能用memset()函数直接初始化。
程序示例

	stTest stTT1, stTT2;
	stTT1.p = (int *)malloc(sizeof(int) * 100);
	stTT2.p = (int *)malloc(sizeof(int) * 100);
	memset(stTT1.p, 0, sizeof(int) * 100);
	memset(stTT2.p, 0, sizeof(int) * 100);

总结

1.memcpy()函数复制结构体中成员变量的值,针对指针对象而言就是复制指针变量所指向的地址。
2.memset()函数会把结构体里面的各成员的值初始化,指针对象这初始化为NULL指针,后面要使用时需先分配空间。

你可能感兴趣的:(C++学习心得,c++,算法,图论)