内存操作函数
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 合起来叫做静态区或全局区)。
详细教程可转
爱编程的大丙