C语言的内存函数

发布时间:2024年01月22日

? ? ? ?内存函数是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语言中不可或缺的部分,它们是程序员的得力“助手”,为程序员们编写出高效、健壮的程序提供了很大帮助!

文章来源:https://blog.csdn.net/m0_74251523/article/details/135735151
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。