目录
内存函数是C语言编程中非常重要的部分,它们使得程序员可以更灵活地管理程序运行时的内存资源。正确使用这些函数对于提高程序的性能和稳定性至关重要。
1. memcpy的使用和模拟实现
1 void * memcpy ( void * destination, const void * source, size_t num ) ;
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
对于重叠的内存,交给memmove来处理,VS中memcpy可能可以处理,但是最好还是不使用。
memcpy使用:
#include <stdio.h>
#include<string.h>
int main()
{
char arr1[10] = "hi grey";
char arr2[10] = { 0 };
memcpy(arr2, arr1, 5);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%c", arr2[i]);
}
return 0;
}
运行结果:
memcpy的模拟实现:
#include <stdio.h>
#include<assert.h>
//memcpy函数的模拟实现
void* my_memcpy(void* dst, const void* src, size_t count)
{
void* ret = dst;
assert(dst);
assert(src);
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 5 * sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d", arr2[i]);
}
return 0;
}
运行结果
2. memmove的使用和模拟实现
1 void * memmove ( void * destination, const void * source, size_t num ) ;
- memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
memmove使用:
#include <stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1 + 2, arr1, 5 * sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d", arr1[i]);
}
return 0;
}
memmove的模拟实现:
#include <stdio.h>
#include<assert.h>
//memmove函数的模拟实现
void* my_memmove(void* dst, const void* src, size_t count)
{
assert(dst && src);
void* ret = dst;
if (dst < src)
{
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
else
{
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return(ret);
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1 + 2, arr1, 5 * sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d", arr1[i]);
}
return 0;
}
运行结果:
3. memset的函数的使用和模拟实现
1 void * memset ( void * ptr, int value, size_t num ) ;
memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。
memset的使用:
#include <stdio.h>
#include<string.h>
int main()
{
char str[] = "hello grey";
memset(str,'*', 6);
printf("%s\n", str);
return 0;
}
运行结果
int 类型举例:
1 int arr[10]={0};
2 memet(arr,1,40); //错误写法
3 memset (arr ,1,sizeof(arr)); //正确写法
memset的模拟实现:
#include <stdio.h>
void my_memset(void* ptr, int value, size_t num)
{
unsigned char* byte_ptr = (unsigned char*)ptr; // 将指针转换为字节指针
for (size_t i = 0; i < num; i++)
{
byte_ptr[i] = (unsigned char)value; // 将指定值写入每个字节
}
}
int main()
{
char str[] = "hello grey";
my_memset(str, '&', 5);
printf("%s\n", str);
return 0;
}
运行结果
4. memcmp的函数的使用和模拟实现
1 int memcmp ( const void * ptr1, const void * ptr2, size_t num );
- 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
- 返回值如图:
memcmp使用:
#include <stdio.h>
#include<string.h>
int main()
{
char blank1[] = "ABCdfGh0";
char blank2[] = "ABCDFgha";
int n;
n = memcmp(blank1, blank2, sizeof(blank1));
if (n > 0)
printf("'%s' is greater than '%s'.\n", blank1, blank2);
else if( n < 0)
printf("'%s' is less than '%s'.\n", blank1, blank2);
else
printf("'%s' is the same as '%s'.\n", blank1, blank2);
return 0;
}
运行结果
memcmp的模拟实现:
#include <stdio.h>
int my_memcmp(const void* str1, const void* str2, size_t num)
{
unsigned char* p1 = (unsigned char*)str1;
unsigned char* p2 = (unsigned char*)str2;
for (size_t i = 0; i < num; i++)
{
if (p1[i] < p2[i])
{
return -1;
}
else if (p1[i] > p2[i])
{
return 1;
}
}
return 0;
}
int main()
{
char str1[] = "Hello";
char str2[] = "grey.";
int n = my_memcmp(str1, str2, sizeof(str1));
if (n > 0)
printf("'%s' is greater than '%s'.\n", str1, str2);
else if (n < 0)
printf("'%s' is less than '%s'.\n", str1, str2);
else
printf("'%s' is the same as '%s'.\n", str1, str2);
return 0;
}
运行结果
总结
以上就是今天要讲的内容,本文通过举例,仅仅简单介绍了C语言内存函数的使用和模拟实现。在C语言程序设计中,内存函数扮演着至关重要的角色,熟练使用这些函数,可以使我们在编写程序时省时省力,当然,通过模拟这些函数,可以更加深入了解函数内部的原理。总之,这些内存函数是C语言中不可或缺的部分,它们是程序员的得力“助手”,为程序员们编写出高效、健壮的程序提供了很大帮助!