memset
函数原型
void* memset( void* dest, int ch, size_t size);
头文件
include <string.h>
功能
将dest所指的内存区域的前size个字节的值全部设置为ch指定的ASCII值,然后返回指向dest的指针。
返回值
返回指向dest的指针。注意返回的指针类型是void,使用时一般要进行强制类型转换。
实现
void* memset( void* dest, int ch, size_t size)
{
if (dest == NULL) {
return NULL;
}
unsigned char* temp = (unsigned char *)dest;
const unsigned char c = (unsigned char)ch;
while (size--) {
*temp++ = c;
}
return dest;
}
memcpy
函数原型
void* memcpy(void* dest, const void* src, size_t size);
头文件
include <string.h>
功能
memcpy()用来复制内存,将src所指的内存内容的前size个字节复制到dest所指的内存地址上。memcpy()并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。与 strcpy()不同的是,memcpy()会完整的复制size个字节,不会因为遇到"\0"而结束。
返回值
返回指向dest的指针。注意返回的指针类型是void,使用时一般要进行强制类型转换。
实现
void* memcpy(void* dest, void* src, size_t size)
{
if (dest == NULL || src == NULL) {
return NULL;
}
unsigned char* temp_dest = (unsigned char *)dest;
unsigned char* temp_src = (unsigned char *)src;
while (size--) {
*(temp_dest++) = *(temp_src++);
}
return dest;
}
memmove
函数原型
void* memmove(void* dest, const void* src, size_t size);
头文件
include <string.h>
功能
memmove()与memcpy()类似都是用来复制src所指的内存内容前size个字节到dest所指的地址上。不同的是,memmove()更为灵活,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。
返回值
返回指向dest的指针。注意返回的指针类型是void,使用时一般要进行强制类型转换。
实现
void* memmove(void* dest, void* src, size_t size)
{
if (dest == NULL || src == NULL) {
return NULL;
}
unsigned char* temp_dest = (unsigned char*)dest;
unsigned char* temp_src = (unsigned char*)src;
size_t index = 0;
if ((temp_dest >= temp_src) || (temp_src + size < temp_dest)) {
for (index = 0; index < size; index++) {
temp_dest[index] = temp_src[index];
}
} else {
for (index = size; index > 0; index--) {
temp_dest[index - 1] = temp_src[index - 1];
}
}
return dest;
}