纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

C语言内存函数 C语言的编程之美之内存函数

小码农UU   2021-09-13 我要评论
想了解C语言的编程之美之内存函数的相关内容吗小码农UU在本文为您仔细讲解C语言内存函数的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C语言,C语言内存函数下面大家一起来学习吧

内存函数

memcpy内存拷贝

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置
  • 这个函数在遇到 ‘\0' 的时候并不会停下来
  • 如果source和destination有任何的重叠复制的结果都是未定义的

原格式

image-20210912150415470

分析

**字面上意思只要是内存里面的东西就都可以进行拷贝所以就打破了字符串拷贝的魔咒什么类型都可以进行拷贝那就不需要想来肯定回和万能类型(通用类型指针-无类型指针)void*有关因为当时做qsort还是印象深刻的

/*num是几个字节的意思*/
void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;
	while (num--)
	{
		//和void*连用char*,分成最小然后一个一个传
		*(char*)dest = *(char*)src;
		((char*)dest)++;//void*无类型不好直接加加就强转char*再加加
		((char*)src)++;
	}	
	return ret;
}

内存拷贝的问题

1.内存相关连的话就会拷贝错误

image-20210912174618496

那你怎么解决内存相关连还不会有上面的错误正面赋值交集的内存空间会被操作两次就会改变原来的值那我们怎么做呢如果从后面来呢前面操作两次会把后面的变了那就先把后面的拿走赋值不就间接的改变了原来会变的情况了吗所以这样上面的代码就得修改了这是朝后面拷贝的情况如果提目是朝前面拷贝的话是不是从后面来就有问题了反而从前面来会比较完美所以我们得两种情况都得考虑到

所以为了解决重叠拷贝的问题就有了memmove这个函数

2.内存不够了还要朝里面拷贝直接程序挂了

image-20210912175703527

memmove内存重叠拷贝

用来处理内存重叠的情况

C语言规定

memcpy 只要处理内存不重叠的拷贝就可以

memmove 处理重叠内存拷贝

我们重写memcpy的代码是满足C语言要求的在vs这个编译器中memcpy实际上是超额完成任务了他的效果已经和memmove效果一样了

image-20210912201352859

你会发现他们跑出来的效果 是一样的所以上面那个测试我就是用我自己的代码测试的(已经达到C语言的标准了)

我们再精细点就是memmove的内容了

原格式

image-20210912195704561

分析

image-20210912200345318

image-20210912210111460

image-20210912210718304

image-20210912212544483

/*num是几个字节的意思*/
void* my_memmove(void* dest,const void* src, size_t num)//memmove和memcpy的参数是一样的
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		while (num--)
		{
			//sre内存从前向后拷贝
			//和void*连用char*,分成最小然后一个一个传
			*(char*)dest = *(char*)src;
			((char*)dest)++;//void*无类型不好直接加加就强转char*再加加
			((char*)src)++;
		}
	}
	else
	{
		while (num--)
		{
			//sre内存从后向前拷贝
			//和void*连用char*,分成最小然后一个一个传
			*((char*)dest+num) = *((char*)src+num);
			//((char*)dest)++;//void*无类型不好直接加加就强转char*再加加
			//((char*)src)++;
		}
	}	
	return ret;
}

image-20210912215713723

memset内存设置

将缓冲区设置为指定的字符

原格式

image-20210912224129279

memcmp内存比较

和strcmp相似只不过一个是比较字符串一个比较内存由于不知道什么类型所以后面有字节个数限制准确的说应该和strncmp相似因为后面都有一个个数的参数

原格式

image-20210912222610487

分析

基本和字符串比较一样就是变成了内存比较罢了

image-20210912233051911

image-20210912233234287

//buf1内存里的内容比buf2内存里的内容大就>0,反之<0
int my_memcmp(const void* buf1, const void* buf2, size_t count)
{
	assert(buf1 && buf2);
	while (--count && *(char*)buf1 == *(char*)buf2)//这个先减减就是细节
	{
		((char*)buf1)++;
		((char*)buf2)++;
	}
	if (*(char*)buf1 - *(char*)buf2 > 0)
		return 1;
	if (*(char*)buf1 - *(char*)buf2 < 0)
		return -1;
	return 0;
}

给你count不要乱超因为他操作的是内存没有字符串补\0的功能

总结

本篇文章就到这里了希望能够给你带来帮助也希望您能够多多关注的更多内容!


相关文章

猜您喜欢

  • Spring JdbcTemplate Spring框架的JdbcTemplate使用

    想了解Spring框架的JdbcTemplate使用的相关内容吗Hudie.在本文为您仔细讲解Spring JdbcTemplate的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Spring,JdbcTemplate下面大家一起来学习吧..
  • Java泛型 深入浅出理解Java泛型的使用

    想了解深入浅出理解Java泛型的使用的相关内容吗威斯布鲁克.猩猩在本文为您仔细讲解Java泛型的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java泛型,Java泛型的使用下面大家一起来学习吧..

网友评论

Copyright 2020 www.sopisoft.net 【绿软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式