C语言之内存函数

今天来给大家介绍一下c语言中的内存函数。

memcpy

  memcpy 是 C 语言中用于复制内存块内容的函数,它与 memmove 函数类似,但不处理源地址和目标地址重叠的情况。memcpy 函数的原型通常如下:

void *memcpy(void *dest, const void *src, size_t n);

其中参数的含义与 memmove 相似:

  • dest 是目标内存地址,即要把数据复制到的位置。
  • src 是源内存地址,即要从哪里开始复制数据。
  • n 是要复制的字节数。

      与 memmove 不同的是,memcpy 函数不做源地址和目标地址重叠的检查,因此在使用时需要确保这些地址不会重叠,否则可能导致未定义的行为或数据损坏。

  memcpy 函数会简单地复制 n 字节从 src 指向的内存地址开始的数据到 dest 指向的内存地址开始的位置,不关心源地址和目标地址是否有重叠。因此,如果源地址与目标地址重叠,使用 memcpy 可能会导致不确定的结果。

memove

  memmove 是一个用于在 C 语言中移动内存块内容的函数。它允许你在内存中移动一定数量的字节,即使源地址和目标地址重叠也可以安全地执行操作。memmove 函数的原型通常如下:

void *memmove(void *dest, const void *src, size_t n);

其中:

  • dest 是目标内存地址,即要把数据移动到的位置。
  • src 是源内存地址,即要从哪里开始复制数据。
  • n 是要移动的字节数。

  memmove 函数会复制 n 字节从 src 指向的内存地址开始的数据到 dest 指向的内存地址开始的位置。它处理源地址和目标地址重叠的情况,确保复制操作不会受到影响。

  memmove 函数在实现上会根据源地址和目标地址的关系来判断应该如何执行复制操作。如果源地址位于目标地址之后,则会从前往后复制;如果源地址位于目标地址之前,则会从后往前复制。这样可以保证数据在复制过程中不会被覆盖或破坏。

memset

  memset 是 C 语言中用于将一段内存块的内容设置为指定值的函数。它可以将指定的字节值(通常是 0 或其他特定值)复制到给定内存块的每个字节中。memset 函数的原型通常如下:

void *memset(void *s, int c, size_t n);

其中:

  • s 是要设置的内存块的起始地址。
  • c 是要设置的字节值,通常是一个无符号字符或者整数。
  • n 是要设置的字节数。

  memset 函数会将起始地址 s 开始的连续 n 个字节都设置为值 c。这意味着整个内存块将被填充为相同的值。

     通常情况下,c 参数是一个 int 类型的值,但实际上 memset 会将其视为 unsigned char 类型。这是因为 memset 预期在每个字节上设置值,而 unsigned char 类型的范围正好是 0 到 255,对应了每个字节的所有可能取值。

memcmp

  memcmp 是 C 语言中用于比较两段内存块内容的函数。它用于比较两个内存区域的内容是否相等。memcmp 函数的原型通常如下:

int memcmp(const void *s1, const void *s2, size_t n);

其中:

  • s1 是第一个内存块的起始地址。
  • s2 是第二个内存块的起始地址。
  • n 是要比较的字节数。

memcmp 函数会比较两个内存块中的前 n 个字节,并返回一个整数来表示它们之间的关系:

  • 如果 s1s2 相等,则返回值为 0。
  • 如果 s1 小于 s2,则返回值为负数。
  • 如果 s1 大于 s2,则返回值为正数。

  memcmp 函数比较的是内存块的内容,而不是它们的地址。因此,即使两个内存块的起始地址不同,只要它们包含的内容相同,memcmp 就会返回 0。

  memcmp 通常用于比较字符串、结构体等复杂数据结构的内容是否相同。例如,可以用它来比较两个字符串是否相等,或者在实现一些数据结构时用来比较节点的内容是否相同。

     需要注意的是,memcmp 函数只比较字节的内容,不会考虑字符串的终止符(如 '\0'),因此它适用于比较任意类型的内存块,而不仅限于字符串。

  • 42
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值