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

c语言内存函数

时间:2024-09-06 22:54:46浏览次数:7  
标签:src 语言 memmove int void char 内存 dst 函数

今天来学习C语言中的内存函数
在这里插入图片描述

目录

1.memcpy

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

代码形式

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

示例


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

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

运行结果

在这里插入图片描述

2.memmove

2.1memmove函数处理的源内存块和目标内存块是可以重叠的
2.2如果源空间和目标空间出现重叠,就得使用memmove函数处理。

代码形式

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

示例

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

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

运行结果

在这里插入图片描述

3.memset

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

代码形式

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

示例

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

int main()
{
	char str[] = "hello world";
	memset(str, 'x', 4);
	printf(str);
	return 0;
}

运行结果

在这里插入图片描述

4.memcmp

4.1比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
4.2在这里插入图片描述

形式

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

示例


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

int main()
{
	char str1[] = "DWAhr120p";
	char str2[] = "dwaHR120P";
	int n;
	n = memcmp(str1, str2, sizeof(str1));
	if (n > 0)
		printf("%s is greater than %s\n", str1, str2);
	else if(n<0)
		printf("%s is less than %s\n", str1, str2);
	else
		printf("%s is the same as %s\n", str1, str2);
	return 0;
}

运行结果在这里插入图片描述

5.模拟实现

5.1memcpy

代码

#include<stdio.h>
#include<assert.h>

void * my_memcpy(void * dst,const void * src, size_t count)
{
	void * ret = dst;
	assert(dst);
	assert(src);

	while (count--)
	{
		*(char *)dst =*(char *)src;
		dst = (char *)dst + 1;
		src = (char *)src + 1;
	}
	return (ret);
}

int main()
{
	char str1[] = "hello world";
	char str2[] = "lyxy";
	my_memcpy(str1, str2,4);
	printf(str1);
	return 0;
}

运行结果

在这里插入图片描述

5.2memmove

代码

void * memmove ( void * dst, const void * src, size_t count)
{
	void * ret = dst;
	if (dst <= src || (char *)dst >= ((char *)src + count)) {
	/*
	* Non-Overlapping Buffers
	* copy from lower addresses to higher addresses
	*/
	while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst + 1;
			src = (char *)src + 1;
			}
		}
	else {
	/*
	* Overlapping Buffers
	* copy from higher addresses to lower addresses
	*/
	dst = (char *)dst + count - 1;
	src = (char *)src + count - 1;
	while (count--) {
		*(char *)dst = *(char *)src;
		dst = (char *)dst - 1;
		src = (char *)src - 1;
			}
		}
	return(ret);
}

总结

今天我们学习了4个内存函数:memcpy,memmove,memset,memcmp用法及memcpy与memmove的模拟实现

对这几个内存函数的分享就到这里了,如果感觉不错,希望可以给博主点个赞或者关注,感谢大家的支持,成为我继续分享的动力,还有什么问题和建议可以在评论区评论,拜拜。
在这里插入图片描述

标签:src,语言,memmove,int,void,char,内存,dst,函数
From: https://blog.csdn.net/2301_79391723/article/details/141064186

相关文章

  • 写一个函数判断整数在系统的储存方式为大端还是小端
    1.何为大小端。所谓大小端就是一个整形在电脑系统中以十六进制的储存方式,当一个数据超过一个字节时在内存中储存顺序会有所不同,按照不同的顺序我们分为大小端两种,大端的低字节保存在高位,小端的低字节保存在低端。例如1在系统中的储存方式有小端储存(0x00000001)   ......
  • 几大编程语言的植物大战僵尸,你更喜欢哪一个
    一、前言 植物大战僵尸,是一款不可多得的游戏,而且属于一玩就容易上头的游戏,接下来,小编将从自己经常使用的几大编程语言方面给大家实现植物大战僵尸这一游戏,下面我们一起来看看。 二、前端版本 这个版本,玩法很多,首先我们打开网页文件,如图:  点击开始按钮,然后就会出......
  • AI大语言模型LLM学习-Token及流式响应
    token是什么?比较官方的token解释:Token是对输入文本进行分割和编码时的最小单位。它可以是单词、子词、字符或其他形式的文本片段。token是自然语言处理的最细粒度。简单点说就是,LLM的输入是一个个的token,输出也是一个个的token。token是由LLM处理的基本数据单元。......
  • Python中的`super()`函数:解锁面向对象编程的高级技巧
    引言在面向对象的世界中,继承是一个非常重要的概念。通过继承,我们可以创建新的类来复用现有类的功能,同时还可以根据需求添加或修改功能。然而,在复杂的继承体系中,正确地调用基类的方法变得尤为重要。super()函数正是为此而生,它提供了一种简洁有效的方式来处理这类问题。本文将带你深......
  • 学习笔记|鹏哥C语言——关键字
    一、 关键字typedeftypedef顾名思义是类型定义,这里应该理解为类型重命名。比如:二、 关键字static在C语言中:static是用来修饰变量和函数的1.修饰局部变量-称为静态局部变量2.修饰全局变量-称为静态全局变量3.修饰函数-称为静态函数三、 修饰局部变量......
  • E31.【C语言】练习:指针运算习题集(上)
    Exercise1求下列代码的运行结果#include<stdio.h>intmain(){ inta[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1); printf("%d",*(ptr-1)); return0;}答案速查:分析:Exercise2 求下列代码的运行结果//在x86环境下//假设结构体的大小是20个字节......
  • 什么是内存分页和分段
    内存分页和分段是操作系统用于管理内存的一种技术,旨在提高内存的使用效率和安全性。它们各自有不同的结构和目的。1.内存分页(Paging)概述内存分页是一种将物理内存划分为固定大小的块(称为页,通常为4KB)和将逻辑地址空间划分为相同大小的块(称为页表)的机制。分页允许不连续的物理内......
  • C语言中有关函数的知识
        前言        C语言函数是一种函数,用来编译C语言,一般包括字符库函数,数学函数,目录函数,进程函数,诊断函数,操作函数等    这里这个函数和我们高中时期学的函数类似,高中的函数是这样    F(x)=5x+21                   ......
  • C语言程序设计(初识C语言后部分)
    不要重来,不要白来,不要重来。5.指针和数组数组:一组相同类型元素的集合指针变量:是一个变量,存放的地址要理解数组名大部分情况下是数组的首元素地址6.二级指针先了解一级指针变量二级指针变量(二级指针变量是用来存放一级指针变量的地址的)7.指针数组指针数组是......
  • 什么是栈内存和堆内存
    栈内存和堆内存是计算机程序运行时用来管理内存的两种不同区域。它们各自有不同的特性和用途。以下是对栈内存和堆内存的详细解释:1.栈内存(StackMemory)定义栈内存是一种用于存储局部变量和函数调用信息的内存区域。栈是先进后出(LIFO,LastInFirstOut)的结构。特点分配与释......