C语言-内存操作函数的详解

内存操作函数

内存操作函数是C语言(以及许多其他编程语言)中用于直接操作内存区域的一组函数。这些函数允许程序员以字节为单位复制、移动、设置和比较内存块中的数据,而无需关心数据类型或数据结构的具体细节。

memcpy

功能:从源内存块复制指定字节数的数据到目标内存块。

原型:

c 复制代码
void *memcpy(void *dest, const void *src, size_t n);

参数:
dest :指向目标内存块的指针。
src :指向源内存块的指针。
n :要复制的字节数。
返回值 :返回目标内存块 dest 的指针。
注意 :源内存块和目标内存块不能重叠。

示例:

c 复制代码
#include <stdio.h>  
#include <string.h>  
  
int main()
 {  
    char src[] = "Hello, World!";  
    char dest[20];  
    memcpy(dest, src, 13); // 复制前13个字节  
    dest[13] = '\0'; // 确保字符串正确终止  
    printf("dest: %s\n", dest); // 输出: dest: Hello, World!  
    return 0;  
}

memmove

功能:从源内存块复制指定字节数的数据到目标内存块,即使源内存块和目标内存块重叠也可以安全操作。

原型:

c 复制代码
void *memmove(void *dest, const void *src, size_t n);

参数:与 memcpy 相同。

返回值 :返回目标内存块 dest 的指针。

示例:

c 复制代码
#include <stdio.h>  
#include <string.h>  
  
int main() 
{  
    char str[] = "Hello, World!";  
    memmove(str + 7, str, 5); // 将 "Hello" 移动到 "World" 的位置,覆盖 "Worl"  
    printf("str: %s\n", str); // 输出: str: Hello, Hello!  
    return 0;  
}

memset

功能:将目标内存块的前 n 个字节设置为指定的值。

原型:

c 复制代码
void *memset(void *s, int c, size_t n);

参数:

s :指向目标内存块的指针。
c :要设置的值(通常是字符的 ASCII 值,会被转换为 unsigned char 后使用)。
n :要设置的字节数。
返回值 :返回目标内存块 s 的指针。

示例:

c 复制代码
#include <stdio.h>  
#include <string.h>  
  
int main() 
{  
    char str[20];  
    memset(str, 'A', 5); // 将前5个字节设置为'A'  
    str[5] = '\0'; // 确保字符串正确终止  
    printf("str: %s\n", str); // 输出: str: AAAAA  
    return 0;  
}

memcmp

功能:比较两个内存块的内容。

原型:

c 复制代码
int memcmp(const void *s1, const void *s2, size_t n);

参数:
s1 :指向第一个内存块的指针。
s2 :指向第二个内存块的指针。
n :要比较的字节数。
返回值

如果 s1 小于 s2,则返回一个负整数。

如果 s1 等于 s2,则返回零。

如果 s1 大于 s2,则返回一个正整数。

示例:

c 复制代码
#include <stdio.h>  
#include <string.h>  
  
int main()
 {  
    char str1[] = "apple";  
    char str2[] = "banana";  
    char str3[] = "apple";  
      
    int result1 = memcmp(str1, str2, 5); // 比较 "apple" 和 "banan" 的前5个字节  
    if (result1 < 0) 
    {  
        printf("str1 is less than str2\n"); // 输出: str1 is less than str2  
    } else if (result1 > 0) 
    {  
        printf("str1 is greater than str2\n");  
    } else
     {  
        printf("str1 is equal to str2\n");  
    }  
  
    int result2 = memcmp(str1, str3, 5); // 比较 "apple" 和 "apple" 的前5个字节  
    if (result2 == 0)
     {  
        printf("str1 is equal to str3\n"); // 输出: str1 is equal to str3  
    }  
  
    return 0;  
}

总结

这四个内存操作函数在C语言编程中非常有用,它们允许我们高效地处理内存块中的数据。memcpy 和 memmove 用于复制内存块,其中 memmove 可以处理重叠的内存区域。memset 用于设置内存块的值,通常用于初始化内存或填充特定的值。memcmp 则用于比较两个内存块的内容。

以上是我对我近期学习的一个总结,如果有不对的地方或者有什么建议的话,都可以提出来哦。

相关推荐
XiaoLeisj11 分钟前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
Jasmine_llq31 分钟前
《 火星人 》
算法·青少年编程·c#
闻缺陷则喜何志丹41 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
Lenyiin1 小时前
01.02、判定是否互为字符重排
算法·leetcode
小林熬夜学编程1 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
鸽鸽程序猿1 小时前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v1 小时前
leetCode43.字符串相乘
java·数据结构·算法