首页 > 系统相关 >C进阶(内存的字符函数)

C进阶(内存的字符函数)

时间:2023-09-11 21:31:50浏览次数:28  
标签:字符 const 进阶 void destination char num 内存

内存设置函数memset()

void * memset ( void * destination, int n,size_t num );用于初始化所定义的变量

void * memset ( void * destination, int n,size_t num )
{
	char *Pdest = (char*)destination;
  while(num--)
  {
  		*Pdest++ = n;
  }
return destination;
}

内存拷贝函数memcpy() [两种情况内存重叠与不重叠]

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

  • 函数memcpy从source的位置开始向后复制num个字节的数据destination的内存位置
  • 这个函数在遇到 '\0' 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的(不确定的)
void* my_memcpy(void* destination, const void* source, size_t num)
{
	//检查参数
	assert(destination != NULL && source != NULL);

	//强制转换与保护参数
	char* Pdest = (char*)destination;
	const char* Psource = (char*)source;


	//第一种情况 Pdest<Psource与 Psource+num <Pdest;
	if (Pdest < Psource || ((Psource + num) < Pdest))
	{
		while (num--)
		{
			*Pdest++ = *Psource++;
		}
	}

	//  第二种情况,内存重叠
	else
	{	
		char* Pdest = (char*)destination + num - 1;
		const char* Psource = (char*)source + num - 1;

		while (num--)
		{
			*Pdest-- = *Psource--;
		}
	}
	return destination;
}

内存移动函数memmove()

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

  • memmove在处理的源内存块和目标内存是可以重叠的
  • 当源空间和目标空间出现重叠时,需要使用memmove函数处理
int main () 
{ 
 char str[] = "memmove can be very useful......"; 
 memmove (str+20,str+15,11); 
 puts (str); 
 return 0; 
}

内存比较函数memcmp()

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

  • 比较从ptr1和ptr2指针开始的num个字节
  • 返回值介绍   相等返回0 , 小于返回小于0的数, 大于返回大于0的数

C进阶(内存的字符函数)_c++

int my_memcompare(const void* dst, const void* src, size_t count)
{
	assert(dst != NULL && src != NULL);
	
	const char* Pdst = (char*)dst;
	const char* Psrc = (char*)src;

	while (count--)
	{
		int result = (*Pdst++ - *Psrc++);

		if (result != 0)
			return result;
		else if (result == 0)
			continue;
	}
	return 0;
} 

标签:字符,const,进阶,void,destination,char,num,内存
From: https://blog.51cto.com/u_16192117/7438811

相关文章

  • 字符串转换
    给你两个长度都为n的字符串s和t。你可以对字符串s执行以下操作:将s长度为l(0<l<n)的后缀字符串删除,并将它添加在s的开头。比方说,s='abcd',那么一次操作中,你可以删除后缀'cd',并将它添加到s的开头,得到s='cdab'。给你一个整数k,请你返回恰好k次操......
  • 查找字符串最长公共子串,请编码实现一个命令行工具,找出指定的2个字符串的最长公共子串
    要求给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。输入描述命令行工具接收两个字符串参数。输入字符串的合法字符集为[a-zA-Z0-9],大小写敏感,无需考虑异常输入场景。输出描述输出一行最长公共子串示例输入1ABCD2345G12345EF输出2345解法一:滑......
  • 小程序性能优化:掌握性能分析工具与内存管理技巧
    在小程序开发中,高效的内存和性能管理是确保应用顺畅运行的关键。本文将介绍如何使用性能分析工具以及一些内存管理的技巧,帮助您优化小程序的性能。使用性能分析工具小程序开发工具提供了强大的性能分析工具,可以帮助您识别和解决性能瓶颈。以下是如何使用性能分析工具的示例:打开小程......
  • 一种高效且节约内存的聚合数据结构的实现
    一种高效且节约内存的聚合数据结构的实现在特定的场景中,特殊定制数据结构能够得到更加好的性能且更节约内存。聚合函数GroupArray的问题GroupArray聚合函数是将分组内容组成一个个数组,例如下面的例子:SELECTgroupArray(concat('ABC-',toString(number)))fromnumbers(20)gr......
  • MySQL数据库进阶 自定义函数
    自定义函数在MySQL中,您可以使用自定义函数来扩展数据库管理系统的功能。自定义函数允许您封装一段可重用的代码,并在查询和其他操作中调用它。以下是在MySQL中创建和使用自定义函数的一般步骤:1、创建自定义函数语法:CREATEFUNCTIONfunction_name(parameters)RETURNSreturn_t......
  • Vue进阶(幺陆柒):Vue 项目调试技能
    (文章目录)一、前言在Vue项目开发过程中,当遇到应用逻辑出现错误,但又无法准确定位的时候,知晓Vue项目调试技巧至关重要。同后台项目开发一样,可以在JS实现的应用逻辑中设置断点,并进行单步、进入方法内、跳出方法等调试,从而准确定位问题根源。本文主要讲解针对JetBrains系列WebStor......
  • Golang 初识: 函数调用与定义丶字符串处理丶Json的处理
    一.基本函数调用与定义1packagemain23import(4"encoding/json"5"errors"6"fmt"7"math/rand"8"mylib/pkg/student"9"mylib/pkg/utils"10"sort"11......
  • 【操作系统】3.内存管理
    1.程序分段和内存分区程序执行需要首先加载到内存中,但完完整整的把一个很大的程序加载进去需要一块完整的地址空间,并且也不符合我们的直观感受,程序员眼中的内存是一个逻辑空间,这里面包括了一段程序、变量、栈等等,我们将一个程序进行分段,然后再存储到内存中这里很容易想到对内存......
  • 字符串减法
    字符串减法1.题目地址https://www.acwing.com/problem/content/1536/2.题目解析具体题意,看上图即可。这里不再赘述。值得注意的是:这道题对于时间复杂度的要求很高,需要考虑优化问题。3.题解4.代码......
  • Java基础学习——字符串
    目录1String概述 2String构造方法代码实现和内存分析2.1创建方式2.2内存区1.StringTable(串池)2.直接赋值创建字符串方式内存图3.通过new创建字符串方式内存图 3字符串比较3.1“==”号比较的内容    1String概述总结:1.String是Java定义好......