1 memset()
在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
函数声明:
void *memset(void *s, int ch, size_t n);
将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
void* memset(void *src, int c, size_t size)
{
assert(src != NULL);
char *pSrc = (char *)src;
while (size--)
{
*pSrc++ = (char)c; //转化为char
}
return src;
}
2 memcpy()
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
- memcpy的函数中源地址指针,目标地址指针,返回地址指针都是void类型。void类型的指针也指向内存地址但是不指定这个地址单元内的数据类型,不能通过间接引用来访问内存中的数据,不能赋值给其他类型的指针,也不能进行算法操作。所以不能对void指针进行如p++的操作,所以需要转换为具体的类型指针来操作,例如char *。
- 内存重叠的问题:拷贝时可能存在两个地址的内存覆盖了,这种情况下从后到前拷贝即可。如何判断内存重叠,只需要比较源地址指针和目标地址指针的在size范围内的大小。
- 有人说memcpy不能处理内存重叠情况,memmove能处理内存覆盖情况,anyway,我在C++11下面发现memcpy可以处理内存覆盖的情况。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//const约束
void *Memcpy(void *dst, const void *src, size_t size);
int main(int argc, char *argv[])
{
char buf[100] = "abcdefghijk";
//memcpy(buf+2, buf, 5);
Memcpy(buf+2, buf, 5);
printf("%s\n", buf+2);
}
void *Memcpy(void *d