C语言实现内存相关操作函数(memset、memcmp、memcpy、memmove) 目录:
1.memset()函数 2.memcmp()函数 3.memcpy()函数 4.memmove()函数
一、memset()函数 (1)函数原型:void my_memset(void ptr, int value, size_t num);** (2)功能:初始化内存空间 (3)代码:
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memset(void* ptr, int value, size_t num)
{
assert(ptr != NULL);
char* tptr = (char*)ptr;
while (num-- != 0)
{
*tptr++ = value;
}
return ptr;
}
int main()
{
int ar[10];
my_memset(ar, 0, sizeof(int) * 10);
for (int i = 0; i < 10; ++i)
{
printf("%d ", ar[i]);
}
printf("\n");
return 0;
}
(4)运行截图: 二、memcmp()函数 (1)函数原型:int my_memcmp(const void ptr1, const void ptr2, size_t num);** (2)功能:对内存中的内容进行比较 (3)代码:
#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{
assert(ptr1 != NULL && ptr2 != NULL);
const char* tptr1 = (char*)ptr1;
const char* tptr2 = (char*)ptr2;
int ret = 0;
while (num-- != 0)
{
ret = *tptr1 - *tptr2;
if (ret != 0)
{
break;
}
tptr1++;
tptr2++;
}
return ret;
}
int main()
{
char* ar = "hello";
char* br = "hella";
int flag = my_memcmp(ar, br, sizeof(char) * 5);
printf("flag = %d", flag);
return 0;
}
(4)运行截图: 这里输出的值是14,原因是‘o’的ASCII码比‘a’的ASCII码大14。 三、memcpy()函数 (1)函数原型:void my_memcpy(void dest, const void* src, size_t num);** (2)功能:内存拷贝 (3)代码:
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest != NULL && src != NULL);
char* pdest = (char*)dest;
const char* psrc = (const char*)src;
while (num-- != 0)
{
*pdest++ = *psrc++;
}
return dest;
}
int main()
{
int ar[10] = { 0,1,2,3,4,5,6,7,8,9 };
int br[10];
my_memcpy(br, ar, sizeof(int) * 10);
for (int i = 0; i < 10; ++i)
{
printf("%d ", br[i]);
}
return 0;
}
(4)运行截图: 四、memmove()函数 (1)函数原型:void my_memmove(void dest, const void* src, size_t num);** (2)功能:与momcpy函数相似,但是mommove函数考虑了内存重叠问题 (3)代码:
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest != NULL && src != NULL);
char* pdest = (char*)dest;
const char* psrc = (const char*)src;
if (psrc >= pdest || pdest >= psrc + num)
{
while (num-- != 0)
{
*pdest++ = *psrc++;
}
}
else
{
pdest = pdest + num - 1;
psrc = psrc + num - 1;
while (num-- != 0)
{
*pdest-- = *psrc--;
}
}
return dest;
}
int main()
{
char str1[20] = "abcdefghi";
char str2[] = "ABCDEF";
printf("str1 = %s\n", str1);
printf("str2 = %s\n", str2);
my_memmove(str1, str2, 6);
printf("str1 = %s\n", str1);
my_memmove(str1 + 2, str1, 5);
printf("str1 = %s\n", str1);
return 0;
}
(4)运行截图: 有小伙伴可能会疑惑,既然memcpy函数和memmove函数作用相一致,那为什么还要多提出一个memmove函数呢?原因是memmove函数考虑了内存重叠的问题,而memcpy函数并没有考虑这一问题(关于什么是没存重叠问题,请读者上网搜索查看)。当程序中不需要考虑内存重叠的问题时,建议使用memcpy函数,而当程序中需要考虑内存重叠问题时,建议使用memmove函数。
|