C语言 内存操作函数 +内存分区

2023-12-14 11:39:28

内存操作函数

memset()
//memset 函数将指定内存区域 ptr 开始的 num 个字节设置为 value。
void *memset(void *ptr, int value, size_t num);

参数:
	ptr:指向要填充的内存区域的指针。
	value:要填充的值,以整数形式传递。
	num:要填充的字节数。
memcpy()
//memcpy 函数会将源内存区域 src 的前 n 个字节的内容复制到目标内存区域 dest 中。
void *memcpy(void *dest, const void *src, size_t n);
参数:
	dest:指向目标内存区域的指针,也就是要将源数据复制到的地方。
	src:指向源内存区域的指针,也就是要复制的数据来源。
	n:要复制的字节数。

为了防止内存重叠导致不确定的结果,建议源内存区域和目标内存区域不能重叠。

memmove()
//memmove 函数会将源内存区域 src 的内容移动到目标内存区域 dest 中,并且可以处理内存重叠的情况。
void *memmove(void *dest, const void *src, size_t n);
参数:
	dest:指向目标内存区域的指针,也就是要将数据移动到的地方。
	src:指向源内存区域的指针,也就是要移动的数据来源。
	n:要移动的字节数。

memmove 函数能够处理源内存区域和目标内存区域重叠的情况,以确保正确的数据移动。

memcmp()
//memcmp 函数会比较 ptr1 和 ptr2 指向的内存区域的前 num 个字节的内容,并根据比较结果返回一个整数值。
int memcmp(const void *ptr1, const void *ptr2, size_t num);
参数:
	ptr1:指向第一个内存区域的指针。
	ptr2:指向第二个内存区域的指针。
	num:要比较的字节数。
返回值:
如果 ptr1 的内容小于 ptr2 的内容,返回一个负整数。
如果 ptr1 的内容等于 ptr2 的内容,返回 0。
如果 ptr1 的内容大于 ptr2 的内容,返回一个正整数。

memcmp 函数是以字节为单位进行比较的,因此适用于比较任意类型的数据。但是,当比较字符串时,建议使用字符串比较函数 strcmp 来代替 memcmp,因为 strcmp 能够根据字符串的终止符’\0’自动确定比较的长度,而不需要显式指定比较的字节数。

堆内存的分配和释放 函数

malloc
//分配一块新的内存,不会初始化。
void* malloc(size_t size);
参数:
	size 表示欲分配的内存大小,以字节为单位。
返回值:
	成功,返回一个指向分配内存的指针
	失败,则返回 NULL

在实际开发中,使用 malloc 分配动态内存可以灵活地管理和利用内存资源,但也需要注意内存的释放和错误处理,以确保程序的正确性和健壮性。

calloc
//与 malloc 类似,用于分配指定数量的内存块。不同之处在于,calloc 还会将分配的内存块初始化为0。
void* calloc(size_t num, size_t size);
参数:
	num 表示欲分配的内存块数目
	size 表示每个内存块的大小(以字节为单位)
返回值:
	成功,返回一个指向分配内存的指针
	失败,则返回 NULL

使用 calloc 可以方便地分配内存,并初始化为零。在需要使用零初始化的情况下,calloc 是一个很有用的函数。

realloc
//用于重新分配已分配内存的大小
void* realloc(void* ptr, size_t size);
参数:
	ptr 是之前使用 malloc、calloc 或 realloc 函数分配的内存块的指针
	size 表示需要重新分配的内存大小(以字节为单位)
返回值:
	成功,返回一个指向重新分配后内存的指针
	失败,返回 NULL。
注意:	
	使用 realloc 重新分配内存后,返回的指针可能是原有内存的地址,也可能是新分配内存的地址,
	因此在重新分配内存后要基于返回的地址进行后续的处理。

使用 realloc 可以动态地调整已分配内存的大小,使其更适应程序的需求。在需要动态修改内存大小的情况下,realloc 是一个有用的函数。

free
//用于释放之前通过 malloc、calloc 或 realloc 分配的内存。
void free(void* ptr);

内存分区

32位系统的虚拟地址空间

在这里插入图片描述

每个进程的虚拟地址空间都是从0地址开始的,我们在程序中打印的变量地址也其在虚拟地址空间中的地址,程序是无法直接访问物理内存的。虚拟地址空间中用户区地址范围是 0~3G,里边分为多个区块:
在这里插入图片描述

其他

linux下 查看内存分区

在 Linux 下,可以在命令行中通过 size 命令查看二进制文件(可执行文件、静态库、动态库等)的大小和节(section)信息。

//基本语法
size [选项] [文件名]

在这里插入图片描述

解释:
text:代码段(可执行文件)或只读数据段(库文件)的大小。
data:已初始化数据段的大小。
bss:未初始化数据段(bss)的大小。
dec:代码段、数据段和bss段的总大小。
hex:十六进制表示的 dec 的大小。
filename:文件的名称。

在没有运行程序前,也就是说程序没有加载到内存前,可执行程序内部已经分好3段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分(有些人直接把 data 和 bss 合起来叫做静态区或全局区)。

详细教程可转

爱编程的大丙

文章来源:https://blog.csdn.net/CYS_2020/article/details/134953454
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。