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