C语言_内存函数

内存函数是 C 标准库中的一组函数,用于管理和操作内存。使用时需要包含头文件<string.h>

1. memcpy的使用和模拟实现

函数形式如下:

void* memcpy(void* destination, const void* source, size_tnum);

函数解析和注意事项:

  • memcpy函数从source的位置开始向后复制num个字节的数据到destination指向的内存位置
  • 函数遇到'\0'的时候不会停下来
  • sourcedestination对应的字节上有任何的重叠,复制的结果都是未定义的

函数的使用:

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

int main(){
	int arr1[] = {1,2,3,4,5,6,7,8,9};
	int arr2[10] = {0};
	memcpy(arr2, arr1, 20);
	int i = 0;
	for(i = 0; i < 9; i++){
		printf("%d ",arr2[i]);
	}
	return 0;
}

函数的模拟实现:

void* my_memcpy(void* dest, const void* src, size_t num){
	void* ret = dest;
	assert(dest);
	assert(src);
	
	while(num--){
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

2. memmove的使用和模拟实现

函数形式如下:

void* memmove(void* destination, const void* source, size_t num);

函数的解析和注意事项:

  • memmovememcpy的区别就是memmove函数处理的源内存块和目标内存块是可以重叠的
  • 源空间和目标空间出现重叠,就得使用memmove函数处理

函数的使用:

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

int main(){
	int arr[] = {1,2,3,4,5,6,7,8,9};
	memmove(arr + 2, arr1, 20);
	int i = 0;
	for(i = 0; i < 9; i++){
		printf("%d ",arr[i]);//输出1 2 1 2 3 4 5 8 9
	}
	return 0;
}

函数的模拟实现:

void* my_memmove(void* dest, const void* src, size_t num){
	if(dest < src){
		while(num--){ // 前 -> 后
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = *(char)src + 1;
		}
	}
	else{ // 后 -> 前
		while(num--){
			*((char*)dest + num) = *((char*)src + num);
		}
	}
}

memcpy函数只能处理不重叠的内存块,而memmove既能处理重叠的内存块,又能处理不重叠的内存块,所以我们在写代码的时候,尽量使用memmove函数。

3. memset的使用

函数形式如下:

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

函数作用:

memset函数用来设置内存,将内存中的值以字节为单位设置为想要的内容

函数的使用:

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

int main(){
	char str[] = "hello world!";
	memset(str,'h',6);
	printf(str); // 输出hhhhhhworld!
	return 0;
}

4. memcmp的使用

函数的形式如下:

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

函数的作用:

  • 比较从ptr1ptr2指针指向的位置开始,向后的num个字节
  • 返回值如下:
    在这里插入图片描述

函数的使用:

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

int main(){
	char buffer1[]="hello world!!";
	char buffer2[]="hello brother!!";
	if(memcmp(buffer1, buffer2, sizeof(str1)) > 0)
		printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
 	else if (memcmp(buffer1, buffer2, sizeof(str1)) < 0) 
 		printf("'%s' is less than '%s'.\n", buffer1, buffer2);
 	else
 		printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值