C语言_内存函数

news/2024/10/3 14:13:48 标签: c语言, 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;
}

http://www.niftyadmin.cn/n/5688504.html

相关文章

二、创建drf纯净项目

1)创建项目 django-admin startproject api2&#xff09;创建app django-admin startproject api_app3)修改settings.py注释掉一些没用的配置 INSTALLED_APPS [# django.contrib.admin,# django.contrib.auth,# django.contrib.contenttypes,# django.contrib.sessions,# d…

VScode 自定义代码配色方案

vscode是一款高度自定义配置的编辑器, 我们来看看如何使用它自定义配色吧 首先自定义代码配色是什么呢? 看看我的代码界面 简而言之, 就是给你的代码的不同语义(类名, 函数名, 关键字, 变量)等设置不同的颜色, 使得代码的可读性变强. 其实很多主题已经给出了定制好的配色方案…

FastGPT的使用

fastGPT的介绍&#xff1a; fastGPT其实和chatGPT差不多 但是好处是可以自行搭建&#xff0c;而且很方便 链接&#xff1a;https://cloud.fastgpt.cn/app/list 首先我们可以根据红框点击&#xff0c;创建一个简易的对话引导 这个机器人就非常的简易&#xff0c;只能完成一些翻…

学生Schutte情绪智力测评

情绪智力(Emotional Intelligence,EI)作为衡量个体在情绪处理、理解和运用方面的能力,近年来在心理学和教育领域得到了广泛关注。Schutte情绪智力量表(Schutte Self-report Emotional Intelligence Scale,SSEIS)作为其中一种常用的测评工具,为高中学生提供了全面评估自…

CMake所学

向大佬lyf学习&#xff0c;先把其8服务器中所授fine 文章目录 前言一、CMakeList.txt 命令1.1 最外层CMakeLists1.1.1 cmake_minimum_required&#xff08;&#xff09;1.1.2 project&#xff08;&#xff09;1.1.3 set&#xff08;&#xff09;1.1.4 add_subdirectory&#xf…

51单片机LED点阵屏

目录 一、点阵屏介绍 ​编辑1、显示原理 2、开发板引脚对应关系 3、点阵屏的内部结构图 4、74HC595介绍 二、LED点阵屏显示图形 1、绘制笑脸 2、编写程序 三、LED点阵屏显示动画 1、利用字模提取软件&#xff0c;获取动画像素数组 2、编写程序 一、点阵屏介绍 LED点阵…

k8s的控制节点不能访问node节点容器的ip地址

master控制node服务器添加容器后,访问不了该node服务器容器的ip,只能在node服务器访问 排查后发现是k8s的master服务器和node节点的网址网段和k8s初始化时提示的ip网段不一致 我之前是192.168.137.50, 实际上master主机期望的是192.168.1.50 解决方案: 1.删除服务器后重建ma…

【Docker】docker的存储

介绍 docker存储主要是涉及到3个方面&#xff1a; 第一个是容器启动时需要的镜像 镜像文件都是基于图层存储驱动来实现的&#xff0c;镜像图层都是只读层&#xff0c; 第二个是&#xff1a; 容器读写层&#xff0c; 容器启动后&#xff0c;docker会基于容器镜像的读层&…