【C语言】内存函数

一、前言

在C语言中有着常见的内存函数,他们可以对内存进行操作,即可以修改内存的内容等,下面我们来简略地学习一下


二、memcpy(内存复制)

cpy是复制的意思,顾名思义,就是将一块指定大小的内存的字节逐一赋值到新的内存块上,下面是memcpy的定义

c 复制代码
void * memcpy ( void * destination, const void * source, 1 size_t num );

下面我们可以举一个简单的使用案例

c 复制代码
#include <stdio.h>
#include <string.h>

int main() {
	int arr1[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int arr2[10];
	
	memcpy(arr2, arr1, sizeof(arr1));

	for (int i = 0; i < 10; i++) {
		printf("%d ", arr2[i]);
	}
	printf("\n");

	return 0;
}


可以看到,这里我将arr1数组的内存数据复制到了arr2数组中

memcpy使用细节:

  • 目标空间大小不能小于要拷贝的内存的大小
  • memcpy不会因为遇到'\0'而停止
  • memcpy目标内存不能是拷贝的内存,不然复制的结果是不可预知的,也就是说内存不能重叠,如:memcpy(arr, arr, ...)

三、 memmove(内存移动)

memmove的功能与memcpy的功能可以说是一样的,但是memmove有一个与memcpy不同的点,就是memmove可以操作重叠的内存,因为memmove会将要复制的内存的内容复制到临时缓冲区,然后再复制带目标内存中

c 复制代码
void * memmove ( void * destination, const void * source,size_t num );

下面我们进行演示

c 复制代码
#include <stdio.h>
#include <string.h>

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

	memmove(arr2, arr1, sizeof(arr1));
	memmove(arr1 + 1, arr1, sizeof(int) * 9);

	for (int i = 0; i < 10; i++) {
		printf("%d ", arr1[i]);
	}
	printf("\n");

	for (int i = 0; i < 10; i++) {
		printf("%d ", arr2[i]);
	}

	return 0;
}


这里我将arr1中的数据复制到了arr2中,然后将arr1的数据进行了后移


四、memset(内存设置)

memset的函数的作用是将指定内存大小的内存块中的值设置为想要的值

c 复制代码
void * memset ( void * ptr, int value, size_t num );

下面我们来举例一些例子

c 复制代码
#include <stdio.h>
#include <string.h>

int main() {
	char arr1[] = "HelloWorld!";
	printf("%s\n", arr1);

	memset(arr1, 'X', 5);

	printf("%s\n", arr1);

	return 0;
}


这里我使用了memset函数将Hello替换成了X


五、memcmp(比较指定字节)

memcmp 逐字节比较两个内存区域的内容,比较的字节数由参数 n 指定。比较从两个内存区域的起始位置开始,依次比较每个字节的值

返回值

  • 如果两个内存区域在前 n 字节内完全相同,返回 0。
  • 如果第一个不同的字节在 s1 中的值小于 s2 中的值,返回 负整数。
  • 如果第一个不同的字节在 s1 中的值大于 s2 中的值,返回 正整数。
c 复制代码
int memcmp ( const void * ptr1, const void * ptr2, size_t num );

同样我们举例一下案例

c 复制代码
#include <stdio.h>
#include <string.h>

int main() {
	char arr1[] = "HelloWorld!";
	char arr2[] = "AelloWorld!";

	if (memcmp(arr1, arr2, sizeof(arr1)) > 0) {
		printf("arr1字符串大!\n");
	}

	return 0;
}


这里我使用了字符串比较,但并不代表着只能比较字符串,memcmp也可以比较其他类型的数组

使用细节

  • 比较的字节数: memcmp 只比较指定的 n 字节。如果两个内存区域在前 n 字节内相同,即使后面的字节不同,memcmp 也会返回 0
  • 内存区域的大小: 确保两个内存区域的大小至少为 n 字节,否则可能会导致未定义行为(如访问越界)
  • 返回值的含义: memcmp 的返回值是一个整数,表示两个内存区域的比较结果。返回值的具体值(正数或负数)取决于第一个不同的字节的值

六、End

关于内存函数的C语言知识就讲到这里了,如果感兴趣的同学也可以自己网上搜索学习更多,希望这篇文章也可以帮助你更好的理解常见的内存函数,与此同时,谢谢你的阅读!

相关推荐
南棱笑笑生8 小时前
20251215给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-6.1】系统时统计eth1的插拔次数
linux·c语言·开发语言·rockchip
刃神太酷啦8 小时前
Linux 进程核心原理精讲:从体系结构到实战操作(含 fork / 状态 / 优先级)----《Hello Linux!》(6)
java·linux·运维·c语言·c++·算法·leetcode
永恒-龙啸8 小时前
spooling假脱机输入输出模拟
c语言·开源·github
前端世界8 小时前
从“看不懂”到“能用”:一次搞清 C 语言指针数组
c语言·开发语言
发疯幼稚鬼8 小时前
归并排序与快速排序
c语言·数据结构·算法·排序算法
福尔摩斯张8 小时前
TCP协议深度解析:从报文格式到连接管理(超详细)
linux·c语言·网络·c++·笔记·网络协议·tcp/ip
光子物联单片机8 小时前
STM32单片机开发入门(十一)STM32CubeIDE下载安装及开发调试说明
c语言·stm32·单片机·嵌入式硬件·mcu
_codemonster9 小时前
自然语言处理容易混淆知识点(一)c-TF-IDF和TF-IDF的区别
c语言·自然语言处理·tf-idf
deng-c-f9 小时前
C/C++内置库函数(2):智能指针
java·c语言·c++
yuhaiqun19899 小时前
新手练 C++ HTTP 服务实操:从 “拆请求头” 到 “发 HTML 响应”
c语言·c++·程序人生·http·html·学习方法·改行学it