C语言内存函数的使用和模拟实现

目录

1.memcpy的使用和模拟实现

使用方法:

模拟实现:

2.memmoved 使用和模拟实现

使用方法:

模拟实现:

3.memset的使用方法

4.memcmp的使用方法


1.memcpy的使用和模拟实现

使用方法:

memcpy函数用于将源内存区域的内容复制到目标内存区域。其使用方法如下:

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

  • dest:目标内存区域的指针,指向要复制到的内存区域。
  • src:源内存区域的指针,指向要复制的内存区域。
  • n:要复制的字节数。

返回值:指向目标内存区域的指针。

注意事项:

  • destsrc指针所指向的内存区域不能重叠,否则复制的结果是不确定的。
  • 如果要复制的字节数n超过了目标和源内存区域的大小,会导致访问越界。
  • memcpy函数是按字节进行复制的,可以用于复制任意类型的数据。

示例:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = { "this is a dog" };
	char arr2[20] = { 0 };
	memcpy(arr2, arr1, 7);
	printf("%s", arr2);
	return 0;
}

以上示例中,将源字符串src的内容复制到了目标字符串dest中,通过strlen(src) + 1可以获取到源字符串的长度(包括字符串结尾的\0),确保复制的内容能够完整保存。

模拟实现:

#include<stdio.h>
#include<assert.h>
#include<string.h>
void* my_memcpy(void* p1, const void* p2, size_t num)
{
	assert(p1 && p2);
	void* crt = (char*)p1;
	while (num--)
	{
		*(char*)p1 = *(char*)p2;
		p1 = (char*)p1 + 1;
		p2 = (char*)p2 + 1;
	}
	return(crt);
}
int main()
{
	char arr1[] = { "this is a dog" };
	char arr2[20] = { 0 };
	my_memcpy(arr2, arr1, 7);
	printf("%s", arr2);
	return 0;
}

2.memmoved 使用和模拟实现

使用方法:

memmove是C语言中的一个函数,用于在内存中复制一段数据。其函数原型为:

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

其中,dest为目标内存地址,src为源内存地址,n为要复制的字节数。

memmove函数的使用方法如下:

1.创建目标内存空间,用于存放复制后的数据。

void *dest = malloc(n);

2.调用memmove函数进行数据复制。

memmove(dest, src, n);

3.使用复制后的数据。

// 使用复制后的数据

4.释放目标内存空间。

free(dest);

需要注意的是,memmove函数能够处理源内存和目标内存有重叠的情况,而memcpy函数则不能。因此,在源内存和目标内存有重叠的情况下,应该优先选择使用memmove函数。

#include<stdio.h>
#include<assert.h>
#include<string.h>
int main()
{
	char arr1[] = { "this is a dog" };
	memmove(arr1, arr1 + 9, 4);
	printf("%s", arr1);
	return 0;
}

模拟实现:

#include<stdio.h>
#include<assert.h>
#include<string.h>
void* my_memmove(void* p1, const void* p2, size_t num)
{
	assert(p1 && p2);
	void * crt = p1;
	if (p2 >= p1 || (char*)p1 >= ((char*)p2 + num))
	{
		while (num--)
		{
			*(char *)p1 = *(char *)p2;
			p1 = (char *)p1 + 1;
			p2 = (char *)p2 + 1;
		}
	}
	else
	{
		while (num--)
		{
			*(char *)p1 = *(char *)p2;
			p1 = (char*)p1 - 1;
			p2 = (char*)p2 - 1;
		}
	}
	return(crt);
}
int main()
{
	int arr1[20] = {1,2,3,4,5,6,7,8,9};
	my_memmove(arr1, arr1+3, 20);
	for (int i = 0; i < 20; i++)
	{
		printf("%d", arr1[i]);
	}
	return 0;
}

3.memset的使用方法

memset是一个C标准库函数,用于将一块内存区域的值设置为给定的值。

memset函数的原型如下:

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

参数说明:

  • ptr:指向要填充的内存块的指针。
  • value:要设置的值,作为整数传递,但是它在每个字节中被转换为无符号字符。
  • num:要填充的字节数。

注意事项:

  • memset函数仅适用于设置整个字节的值。如果要设置的是其他数据类型(如整型、浮点型等),则需要使用其他方式。
  • memset函数通常用于初始化数组或清空缓冲区。但是,对指针数组或结构体进行初始化时,最好使用其他方法。

示例用法:

#include <stdio.h>
#include <string.h>

int main() {
    char str[50];
    strcpy(str, "Hello world!");

    printf("Before memset: %s\n", str);

    memset(str, '-', 7);
    
    printf("After memset: %s\n", str);

    return 0;
}

输出结果:

Before memset: Hello world!
After memset: -------

上述示例使用memset函数将字符串str的前7个字符设置为连字符-

4.memcmp的使用方法

memcmp是一个C库函数,用于比较两个内存块的内容是否相同。

函数签名如下:

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

参数说明:

  • ptr1: 指向要比较的第一个内存块的指针。
  • ptr2: 指向要比较的第二个内存块的指针。
  • num: 要比较的字节数。

返回值说明:

  • 如果两个内存块相同,则返回0。
  • 如果第一个内存块小于第二个内存块,则返回一个负数。
  • 如果第一个内存块大于第二个内存块,则返回一个正数。

用法示例:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Hello";
    char str2[] = "Hello";
    char str3[] = "World";

    int result1 = memcmp(str1, str2, sizeof(str1));
    int result2 = memcmp(str1, str3, sizeof(str1));

    if (result1 == 0) {
        printf("str1 and str2 are equal\n");
    } else {
        printf("str1 and str2 are not equal\n");
    }

    if (result2 == 0) {
        printf("str1 and str3 are equal\n");
    } else {
        printf("str1 and str3 are not equal\n");
    }

    return 0;
}

输出结果:

str1 and str2 are equal
str1 and str3 are not equal

上述示例中,使用memcmp函数分别比较了str1和str2、str1和str3两个内存块的内容。由于str1和str2相等,所以返回值为0;而str1和str3不相等,返回值不为0。根据返回值可以判断两个内存块的内容是否相同。

  • 28
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言中,我们可以模拟实现memcpy函数。memcpy函数的原型为void * memcpy(void * destination, const void * source, size_t num),它的作用是将源地址(source)指向的内存块的数据拷贝到目标地址(destination)指向的内存块中,拷贝的字节数由第三个参数num指定。 要实现memcpy函数,我们可以按照以下步骤进行操作: 1. 首先,我们需要创建一个与源内存块相同大小的目标内存块,并将目标内存块的地址保存在destination指针中。 2. 接下来,我们使用一个循环来逐字节地将源内存块的数据复制到目标内存块中,直到拷贝的字节数达到了num的值。 3. 最后,我们返回目标内存块的地址(destination指针),作为函数的返回值。 下面是一个示例的实现代码: ```c void *my_memcpy(void *destination, const void *source, size_t num) { char *dest = (char *)destination; const char *src = (const char *)source; for (size_t i = 0; i < num; i++) { dest[i = src[i]; } return destination; } ``` 在这个实现中,我们将destination和source指针都转换为char类型的指针,这样可以逐字节地进行数据拷贝。然后,我们使用一个循环来逐字节地将源内存块的数据复制到目标内存块中,直到拷贝的字节数达到了num的值。最后,我们返回目标内存块的地址作为函数的返回值。 这样,我们就实现了一个简单的memcpy函数模拟实现。需要注意的是,这只是一个简单的示例实现,实际的memcpy函数可能会有更复杂的实现方式,具体实现可能因编译器和操作系统的不同而有所差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值