超详细讲解内存函数(保姆级教程!!!)
内存操作函数函数
memcpy函数
即从存储区 src 复制 num 个字节到存储区 dest,
dest – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
src – 指向要复制的数据源,类型强制转换为 void* 指针。
num – 要被复制的字节数。
memcpy函数的使用
大家看下面这一段代码:
// 将字符串复制到数组 dest 中
#include <stdio.h>
#include <string.h>
int main ()
{
const char src[50] = "http://www.runoob.com";
char dest[50];
memcpy(dest, src, strlen(src)+1);
printf("dest = %s\n", dest);
return(0);
}
编译并运行上面的程序后可以得到输出的结果为
dest = http://www.runoob.com。
不仅如此,memcpy函数还可以完成对自身内容的拷贝:
int main()
{
int arr1[] = {
1,2,3,4,5,6,7,8,9,10 };
//int num = 0;
//scanf("%d", num);
memcpy(arr1 + 2, arr1, 20);
for (int i = 0;i < 10;i++)
{
printf("%d ", arr1[i]);
}
}
上述代码表示了memcpy函数相当于将“12345”的内容拷贝到“34567”中,但运行程序后,我们会发现事实并非如此。
我们会发现,内容似乎并没有被很好地替换成功,反而出现了一些问题,而这也正是memcpy函数具有缺陷的地方,memcpy函数具有以下几个特点:
1、函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2、这个函数在遇到 ‘\0’ 的时候并不会停下来。
3、如果source和destination有任何的重叠,复制的结果都是未定义的。
因此,memcpy函数在拷贝自身的时候,当dest与src有任何的重叠,都会发生拷贝的失败,而这又是为什么呢?
遵循上面的代码,假如我们要将12345拷贝到34567中,那么:
既然如此,我们该如何解决这个问题呢?其实很简单。
我们可以进行逆向思维,如果从前往后进行拷贝替换行不通,那么我们可以从后往前进行拷贝替换。这样的话5替换7、4替换6,3替换5…我们便可以惊奇的发现,这样子替换成功了,不会出现拷贝的内容被替换的情况。
于是许多小伙伴明白了,以后拷贝替换就从后往前进行就好了,可事实真是如此吗?大家看下面一张图:
这时候如果我们按照从最后一个开始置换,即从后往前进行置换,又会出现相同的问题。
这是因为同第一种情况一样,当7拷贝到5,6拷贝到4时,发现将要拷贝的内容已经被替换掉了,而这个时候从第一个即从前往后进行拷贝才能成功。
那么,我们可以发现一个规律: