memcpy、memset用法总结

本文详细介绍了C++中memcpy和memset函数的使用。memcpy用于字节级别的内存复制,避免了直接赋值可能导致的内存泄漏问题;memset则用于设置内存块的每个字节为特定值。示例代码展示了它们的使用场景,并强调了堆内存管理的重要性。同时,文中探讨了为何在某些情况下使用堆分配内存和memcpy优于栈分配和直接赋值。
摘要由CSDN通过智能技术生成

1. memcpy用法

说来惭愧,虽然有经常在代码里接触到这个函数,一直以为这个函数的作用是复制内存,今天才发现,是复制内存上每个字节上的内容。具体的信息可以查看下官方文章的描述。通过下面这个例子看看情况:

#include <iostream>
#include <string>
#include <cstring>

int main ()
{
  char* data;
  char* tdata;
  data = new char[10];
  tdata = new char[10];
  char* temp = "i am test";
  std::cout << "data memery: " << static_cast<const void *>(data) << std::endl;
  std::cout << "tdata memery: " << static_cast<const void *>(tdata) << std::endl;
  std::cout << "temp memery: " << static_cast<const void *>(temp) << std::endl;


  memcpy(tdata, temp, 10);
  memcpy(data, tdata, 10);

  std::cout << "data memery after memcpy: " << static_cast<const void *>(data) << std::endl;
  std::cout << "tdata memery after mencpy: " << static_cast<const void *>(tdata) << std::endl;
  std::cout << "data content after memcpy: " << data << std::endl;

  tdata = temp;
  std::cout << "tdata memery after assign: " << static_cast<const void *>(tdata) << std::endl;
  std::cout << "data content after assign: " << tdata << std::endl;
}

输出:
在这里插入图片描述

通过上面的输出可以发现,mencpy只是一个个字节的拷贝源指针上的内容到目的指针。

另外,值得注意的是,如果我们直接将一个char* 的变量赋值(assign)给一个另一个char* 时,被赋值的指针地址将被替换。因此,对于从堆上申请的内存,我们不能直接采用赋值的方式,不然会导致内存泄漏,这也是为什么需要用memcpy来拷贝char*变量的内容。

顺便再说下,为什么需要用堆上内存更好,为什么不用栈上的变量,这个我其实不太清楚二者的优劣(内存真的太深奥了。。。),做下可能猜想,如果我们将一个临时变量赋值给本地变量供程序后续使用时(根据上一段的描述我们知道,此时是将临时变量的地址赋给本地变量),将出现临时变量的地址在其生命周期后被销毁后,我们仍在使用这个地址,此时将造成致命的错误,所以采用new(堆)+memcpy的方式会更好。

最后贴一个官方的例子,加深下理解:

/* memcpy example */
#include <stdio.h>
#include <string.h>

struct {
  char name[40];
  int age;
} person, person_copy;

int main ()
{
  char myname[] = "Pierre de Fermat";

  /* using memcpy to copy string: */
  memcpy ( person.name, myname, strlen(myname)+1 );
  person.age = 46;

  /* using memcpy to copy structure: */
  memcpy ( &person_copy, &person, sizeof(person) );

  printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );

  return 0;
}

在这里插入图片描述

2. memset的用法

查看这篇https://blog.csdn.net/u014174955/article/details/50880202

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值