许昌专业做企业网站的,企业门户网站 源码,百度网页游戏中心,做网站有哪些公司今天又来写一篇C的文章#xff0c;这里要讲的是C语言中的几个内存函数#xff0c;主要是讲解功能和用法#xff0c;望能耐心观看哦。望官方也多多曝光。
目录
memcpy memmove
memset memcmp memcpy memcpy 是 C 语言标准库中的一个函数#xff0c;用于复制内存块的内容…今天又来写一篇C的文章这里要讲的是C语言中的几个内存函数主要是讲解功能和用法望能耐心观看哦。望官方也多多曝光。
目录
memcpy memmove
memset memcmp memcpy memcpy 是 C 语言标准库中的一个函数用于复制内存块的内容。它的主要作用是将一个源内存区域的内容复制到另一个目标内存区域且是按照所给字节数进行复制。 函数原型
void *memcpy(void *dest, const void *src, size_t n); 参数说明 dest 指向目标内存区域的指针复制的结果将存储在这个位置。 src 指向源内存区域的指针要复制的内容将从这个位置读取。 n 要复制的字节数。 函数行为 1. memcpy 会从源内存区域复制指定数量的字节到目标内存区域。 2. 复制是按字节进行的不考虑数据类型或字节序。 3. 函数返回指向目标内存区域的指针。 代码使用例子
#include stdio.h
#include string.h
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] { 0 };memcpy(arr2, arr1, 20);int i 0;for (i 0; i 10; i){printf(%d , arr2[i]);}return 0;
} 代码解析上面代码中我们调用函数memcpy函数进行传参将arr1前20个字节的内容复制到arr2中。根据结果确实如此20个字节为5个整形元素大小所以这里从arr1中12345 复制到arr2中至于后面的5个0是因为在VS中如果未对数组中进行初始化的元素会默认为0. 为了让大家更了解这个函数这里为大家模拟实现一下memcpy函数
void* Memcpy(void* dst, const void* src, size_t count)
{void* ret dst;assert(dst);assert(src);/** copy from lower addresses to higher addresses*/while (count--) {*(char*)dst *(char*)src;dst (char*)dst 1;src (char*)src 1;}return(ret);
}
这里面强制转化为char*的指针是因为让指针dst和src都是一个一个字节的往后访问。 需要注意的是memcpy是不能对两个有重叠部分的指针完成准确的复制的所以我们需要看下一个有重叠部分也可以完成操作的函数memmove。 memmove memmove 是 C 语言标准库中的一个函数它与 memcpy 类似用于复制内存块的内容。与 memcpy 不同的是 memmove 可以在源和目标内存区域有重叠的情况下安全地进行复制。 函数原型
void *memmove(void *dest, const void *src, size_t n); 参数说明 dest 指向目标内存区域的指针复制的结果将存储在这个位置。 src 指向源内存区域的指针要复制的内容将从这个位置读取。 n 要复制的字节数。 函数行为 1. memmove 用于在不同的内存位置之间复制数据即使源和目标区域有重叠也能正确工作。 2. 它会根据源和目标的相对位置以适当的方式复制数据确保结果是正确的。 代码简单使用例子
#include stdio.h
#include string.h
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 2, arr1, 20);int i 0;for (i 0; i 10; i){printf(%d , arr1[i]);}return 0;
} 代码解析这里很明显即使我们调用memmove函数时传过去的指针地址是明显有重叠部分的但是这里我们看见结果确实是没问题的将arr的前20个字节即5个元素复制到arr2往后的元素。 还是为了大家更好理解函数的逻辑给大家模拟实现一下memmove函数
void* memmove(void* dst, const void* src, size_t count)
{void* ret dst;if (dst src || (char*)dst ((char*)src count)) {/** Non-Overlapping Buffers* copy from lower addresses to higher addresses*/while (count--) {*(char*)dst *(char*)src;dst (char*)dst 1;src (char*)src 1;}}else {/** Overlapping Buffers* copy from higher addresses to lower addresses*/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);
} 这里面强制转化为char*的指针是因为让指针dst和src都是一个一个字节的往后访问。 memset memset 是 C 语言标准库中的一个函数用于将指定的内存区域填充为特定的值。 函数原型
void *memset(void *str, int c, size_t n); 参数说明 str 指向要填充的内存区域的指针。 c 要填充的特定值。通常是一个整数类型的值。 n 要填充的字节数。 函数行为 1. memset 使用指定的值 c 填充内存区域的前 n 个字节。 2. 填充是按字节进行的无论内存区域的实际数据类型如何。 简单代码使用例子
#include stdio.h
#include string.h
int main()
{char str[] hello world;memset(str, x, 6);printf(str);return 0;
} 函数较为简单就不多加解释了。 memcmp memcmp是一个用于比较内存区域的函数 函数原型
int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 参数说明两个需要比较的内存块的起始地址 ptr1 和 ptr2以及需要比较的字节数 num。 函数行为
函数会比较 ptr1 和 ptr2 指向的内存块前 num 个字节的内容返回值为整型表示比较结果如果两个内存块的前 num 个字节完全相等则返回0如果 ptr1 指向的内存块小于 ptr2 指向的内存块则返回负数如果 ptr1 指向的内存块大于 ptr2 指向的内存块则返回正数。 代码简单实用例子
#include stdio.h
#include string.h
int main()
{char buffer1[] hello;char buffer2[] good;int n;n memcmp(buffer1, buffer2, sizeof(buffer1));if (n 0)printf(%s 比 %s大.\n, buffer1, buffer2);else if (n 0)printf(%s 比 %s小.\n, buffer1, buffer2);elseprintf(%s 与 %s一样大.\n, buffer1, buffer2);return 0;
} 今天文章就结束了觉得有用可以点个赞再走唔。