首页 > 系统相关 >C语言内存函数

C语言内存函数

时间:2024-09-29 18:49:07浏览次数:9  
标签:src 函数 dest void C语言 char int num 内存

1.memcpy的使用和模拟实现

void * memcpy ( void * destination, const void * source, size_t num );
  • 函数memcpy从source 的位置开始向后复制num个字节的数据到destination 指向的内存位置
  • 这个函数在遇到"\0"的时候并不会停下来
  • 如果source 和destination 有任何的重叠,复制的结果都是未定义的
#include <stdio.h>
#include <string.h>
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 < 10; i++)
 {
 printf("%d ", arr2[i]);
 }
 return 0;
}

在这里插入图片描述
memcpy函数模拟实现

void* my_memcpy(void*dest,const void*src,size_t num)
{
	void* ret = dest;
	assert(dest && src);
	while(num--)
	{
		//拷贝1字节
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
		
	}
	return ret;
}

在这里插入图片描述
对于重叠的内存,交给memmove处理

2.memmove使用和模拟实现

void * memmove ( void * destination, const void * source, size_t num );
  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
  • 如果源空间和目标空间出现重叠,使用memmove
int main()
{
	
	int arr[] = { 1,2,3,4,5,6,7,8 ,9,10};

	//my_memcpy(arr+2, arr, 20);
	memmove(arr+2,arr,20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
}

在这里插入图片描述
memmove模拟实现

void* my_memmove(void* dest, void* src, size_t num)
{
	void* ret = dest;
	assert(dest);
	assert(src);
	if (dest < src)
	{
		//前,后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;


		}
	}
	else
	{
		//后,前
		while (num--)
		{
			//num=19
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

在这里插入图片描述

解释:当目标地址≤源地址或者目标空间≥原地址加上要复制的字节数,说明源空间和目标空间不重叠,逐字节从前往后复制,当if条件不满足,则说明两者有重叠部分,将指针分别移动到末尾,从后向前逐字节复制,直到达到复制字节数,返回目标地址

3.memset函数的使用

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

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

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

	memset(arr, 0, 20);
	//以字节为单位设置内存值
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

在这里插入图片描述

4.memcmp函数的使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
  • 比较从ptr1和ptr2指针指向的位置开始向后的num个字节
  • 返回值如下
    在这里插入图片描述
#include <stdio.h>
#include <string.h>
int main()
{
 char buffer1[] = "DWgaOtP12df0";
 char buffer2[] = "DWGAOTP12DF0";
 int n;
 n = memcmp(buffer1, buffer2, sizeof(buffer1));
 if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
 else if (n < 0) printf("'%s' is less than '%s'.\n", buffer1, buffer2);
 else printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
 return 0;
}

在这里插入图片描述

  • 这里比较的是ASCII码值

标签:src,函数,dest,void,C语言,char,int,num,内存
From: https://blog.csdn.net/weixin_65793499/article/details/142110211

相关文章

  • unix中的exec族函数介绍
    一、前言本文将介绍unix中exec族函数,包括其作用以及使用方法。当一个进程调用fork函数创建一个新进程后,新进程可以直接执行原本正文段的其他内容,但更多时候,我们在一个进程中调用fork创建新的进程后,希望新进程能够执行其他的程序。(举个实际的例子,A进程调用fork后,我们更多的......
  • 实验1 C语言输入输出和简单程序编写
    task11#include<stdio.h>2intmain()3{4printf("0\n");5printf("<H>\n");6printf("II\n");7return0;8}   task1_1.c1#include<stdio.h>2intmain()3{4int......
  • Excel:常用函数
    一、DAYS(返回两个日期之间的天数)以下演示是在windows操作系统环境,office软件进行操作的1.1单元格设置日期格式1.2设置Days函数公式:=DAYS(C2,B2)全部天数二、SUM(求和)公式:=SUM(B2:C2)三、SUMIFS(多条件求和)3.1统计销售部报销金额公式:=SUMIFS(D:D......
  • wait_event_interruptible_timeout() 函数
     原文链接:https://blog.csdn.net/wuyongpeng0912/article/details/45723657 网上有关于此函数的分析,但大都是同一篇文章转载来转载去,没有进一步的分析。做个小结:了解函数功能,除了直接看代码逻辑,最有效的当是注释内容了。如下:函数原型:wait_event_interruptible_timeout......
  • 统计进程内存使用量
    统计进程内存使用量#!/bin/bash#文件名:memory_show.sh#作者:wanghongwei#日期:2024年9月29日#版本:1.0#描述:统计进程内存使用量#使用方式:./memory_show.sh[-k/-K][-m/-M][-g/-G]#初始化所有进程的统计变量declare-ATOTAL_MEM_SIZETOTAL_MEM_SIZ......
  • C语言 17 宏定义
    前面认识了#include指令,接着来看#define指令,它可以实现宏定义。宏是啥意思?把参数批量替换到文本中,这种实现通常称为宏(macro)或定义宏(definemacro)可以通过#define来定义宏,规则如下:#define宏名(记号)内容比如现在想通过宏定义一个PI:#definePI3.1415926这样就可以......
  • C语言 18 条件编译
    再来看看条件编译,还可以根据条件,选择性地对某些内容进行忽略。来认识一下#ifdef、#else、#endif这三种条件编译指令:#include<stdio.h>//ifdef用于判断是否定义了符号PI,如果没有的话则处理以下的指令#ifdefPI#defineM666//如果定义了符号PI,那么就处理这个分支的语......
  • MySQL窗口函数总结(三)
    MySQL窗口函数(WindowFunctions)是一种高级的SQL查询技巧,它允许在结果集的一组相关行上执行计算。窗口函数可以用于处理分组、排序、累计等复杂的聚合任务,使得查询更加简洁和高效。在MySQL8.0及更高版本中,支持窗口函数。以下是一些常用的窗口函数:ROW_NUMBER():为结果集中的......
  • MySQL窗口函数汇总(二)
    MySQL窗口函数详解MySQL从8.0版本开始引入了窗口函数,这是一个强大的特性,可以大大简化复杂的数据分析任务。本文将详细介绍MySQL窗口函数的概念、语法和常见用法,并结合实际应用场景进行说明。什么是窗口函数?窗口函数是一种能够对结果集中的一组行进行操作的函数。它们类似于聚合函......
  • C语言课程设计:基于C语言的银行管理系统【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:C开发工具:VScode二、系统功能1.客户管理:包括客户信息的增删改查、客户身份验证、客户分组等功能。2.账户管理:包括账户的开户、销户、冻结、解冻、查询、......