轻松拿捏C语言——【内存函数】

2024-06-08 1467阅读

轻松拿捏C语言——【内存函数】

轻松拿捏C语言——【内存函数】

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊

🎉创作不易,请多多支持🎉

🌈感谢大家的阅读、点赞、收藏和关注💕

🌹如有问题,欢迎指正~~


目录👑

💕1. memcpy()💕

函数原型❤️

示例❤️

 函数模拟❤️

🌟🌟2. memmove()

函数原型🌙

示例🌙

函数模拟实现🌙

💕3. memset()💕

函数原型❤️

示例❤️

🌟🌟4. memcmp()

函数原型🌙

示例🌙


C语言中的内存操作函数:memcpy, memmove, memset, memcmp

在C语言中,我们经常需要对内存块进行各种操作,比如复制、移动、设置值以及比较。C标准库提供了四个非常有用的函数来处理这些操作:memcpy, memmove, memset, memcmp

下面我将逐一介绍这些函数及其用法。

💕1. memcpy()💕

用于从源内存块复制指定数量的字节到目标内存块。这个函数不检查源内存和目标内存是否重叠,因此如果重叠,它可能会导致未定义的行为。

函数原型❤️

void *memcpy(void *dest, const void *src, size_t n);
  • dest:指向目标内存块的指针。
  • src:指向源内存块的指针。
  • n:要复制的字节数。
  • 这个函数在遇到 '\0' 的时候并不会停下来。

    示例❤️

    #include 
    #include 
    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  
    

    打印 1 2 3 4 5 0 0 0 0 0

    #include   
    #include   
    int main() {  
        char src[] = "Hello, World!";  
        char dest[20];  
        memcpy(dest, src, 13); // 复制前13个字节(包括空字符'\0')  
        printf("%s\n", src);  
        printf("%s\n", dest);  
        return 0;  
    }

     函数模拟❤️

    法一:

    //法一
    void* my_memcpy1(void* dest,const void* source, size_t num)
    {
    	void* ret = dest;
    	while (num--)
    	{
    		//*((char*)dest)++ = *((char*)source)++;
    		*(char*)dest = *(char*)source;
    		dest = (char*)dest + 1;
    		source = (char*)source + 1;
    	}
    	return ret;
    }
    int main()
    {
    	int arr1[] = { 1,2,3,4,5,6,7,8 };
    	int arr2[5] = { 0 };
    	//memcpy(arr2, arr1 + 2, 17);
    	my_memcpy1(arr2, arr1 + 2, 17);
        int i;
        for (i = 0; i  
    

    法二:

    //法二
    void* my_memcpy2(void* dest, void* src, size_t num)
    {
    	char* d = (char*)dest;
    	char* s = (char*)src;
    	while (num--)
    	{
    		*d++ = *s++;
    	}
    	return dest;
    }
    int main()
    {
    	int arr1[] = { 1,2,3,4,5,6,7,8 };
    	int arr2[5] = { 0 };
    	//memcpy(arr2, arr1 + 2, 17);
    	my_memcpy2(arr2, arr1 + 2, 17);
        int i;
        for (i = 0; i  
    

     打印3 4 5 6 7

    🌟🌟2. memmove()

    memmove() 函数与 memcpy() 类似,但它可以正确处理源内存和目标内存重叠的情况。

    如果源空间和目标空间出现重叠,就得使用memmove函数处理。

    memmove也具有memcpy的功能

    函数原型🌙

    void *memmove(void *dest, const void *src, size_t n);

    参数与 memcpy() 相同。

    示例🌙

    #include 
    #include 
    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  
    

    打印1 2 1 2 3 4 5 8 9 10

    #include   
    #include   
    int main() {
        char str[] = "Hello, World!";
        memmove(str + 6, str, 5); 
        printf("%s\n", str);
        return 0;
    }

     打印Hello,Hellod!

    函数模拟实现🌙

    void* my_memmove(void* dest, void* src, size_t num)
    {
    	char* d = (char*)dest;
    	char* s = (char*)src;
    	if (dest  
    

    打印3 4 5 4 5 6 7 8 9 10

    💕3. memset()💕

    memset() 函数用于将指定内存块的前n个字节设置为某个给定的值(一个无符号字符)。

    函数原型❤️

    void * memset ( void * ptr, int value, size_t num );

    memset是来设置内存的,将内存中的值以字节为单位设置成想要的内容 。

    从地址ptr开始往后的num个字节都设置成value

    示例❤️

    #include 
    #include 
    int main ()
    {
     char str[] = "hello world";
     memset (str,'x',6);
     printf(str);
     return 0;
    }

    输出:xxxxxxworld

    #include   
    #include   
    int main() {
        char str[50]={0};
        memset(str, 'A', 10); // 将str的前10个字节设置为'A'  
        printf("%s\n", str);   
        return 0;
    }

      输出 :AAAAAAAAAA

    注意:memset() 只会设置到字符串的指定长度,并不会自动添加字符串结束符 '\0'。

    🌟🌟4. memcmp()

    memcmp() 函数用于比较两个内存块的内容。

    函数原型🌙

    int memcmp ( const void * ptr1, const void * ptr2, size_t num );

    • 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节 

    如果ptr1和 ptr2 的前n个字节完全相同,则返回 0;

    如果 ptr1小于 ptr2 ,则返回一个小于 0 的值;

    如果ptr1大于  ptr2 ,则返回一个大于 0 的值。

    示例🌙

    #include 
    #include 
    int main()
    {
    	int arr1[] = { 1,2,3,4,5 };
    	int arr2[] = { 1,2,3,6,5 };
    	int ret = memcmp(arr1, arr2,13);
    	printf("%d", ret);//-1
    	return 0;
    }

    打印-1

    #include   
    #include   
    int main()
    {
        char str1[] = "Hello";
        char str2[] = "World";
        int result = memcmp(str1, str2, 5); // 比较两个字符串的前5个字节  
        if (result  0) {
            printf("str1 is greater than str2\n");
        }
        else {
            printf("str1 is equal to str2\n");
        }
        return 0;
    }

    打印:str1 is less than str2 


    轻松拿捏C语言——【内存函数】

     🎉🎉🎉本文内容结束啦,希望各位大佬多多指教!

    🌹🌹感谢大家三连支持

    💕敬请期待~~

     

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]