C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (二)

简介: `memset()`是一个C语言库函数,用于将指定内存区域的字节设置为特定值。函数原型为`void *memset(void *ptr, int value, size_t num)`,参数分别为指向内存起始位置的指针、要设置的值和设置的字节数。`memcmp()`函数则用于比较两个内存区域,返回值表示比较结果,原型为`int memcmp(const void *ptr1, const void *ptr2, size_t num)`。它比较指定字节数的内存,并根据比较结果返回整数值。

C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (一)+ https://developer.aliyun.com/article/1518728?spm=a2c6h.13148508.setting.14.4ab74f0eMP3Wpx


三、memset()


函数原型


void * memset ( void * ptr, int value, size_t num );


参数说明


  • 第一个参数 ptr 为指针类型,表示要进行操作的内存的地址。如要对数组arr进行内存内容设置,则该参数的值为arr。


  • 第二个参数 value 为要设定的内存的值。该值的数据类型是int型,但char值也是可以的。


  • 第三个参数 num 为要设置值的内存的字节数。注意:是字节数,而不是元素的个数。如要改变两个int类型的值,num应为 8 ,而不是2.



使用说明


例如,有数组arr:[ 1  2  3  4  5 ]


要将其前两个元素值设定为0,则可使用memset函数:memset(arr, 0 , 8)


输出:[ 0  0  3  4  5 ].原理如下(以小端存储的形式展现):


arr数组为int类型,一个int为4字节、32bit,内存中的存储如下(二进制):


01  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00  


02  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00  


03  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00  


04  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00  


05  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00  


memset(arr, 0, 8),将前8个字节(2个int)置为0(其实每个比特位都被置为0了,但由于其它的比特位已经为0,故没有标出来)




但若使用 memset(arr, 1, 8),并不是把数组前两个元素置为 1 .因为memset()函数是针对内存中每个字节的,memset(arr, 1, 8)的实际作用是将前8个字节中的内容全部置为1.


00  00  00  01    00  00  00  01    00  00  00  01    00  00  00  01  


00  00  00  01    00  00  00  01    00  00  00  01    00  00  00  01  


03  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00  


04  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00  


05  00  00  00    00  00  00  00    00  00  00  00    00  00  00  00  


此时,前4字节按照int类型解析出来,结果为1000000010000000100000001,即16843009。




总结:


  • int类型数组除了置0外,用memset置换成任何数都是错的。
  • memset只适用于每个元素只占1个字节的数组,比如char型数组。因为memset的操作单位就是每个字节。只有char类型的数组不会出现错误。


使用示例


//示例来自cplusplus官网
 
/* memset example */
#include <stdio.h>
#include <string.h>
 
int main ()
{
  char str[] = "almost every programmer should know memset!";
  memset (str,'-',6);    //表示将从str开始,包括str向后6个字节的内存内容置为'-'
  puts (str);
  return 0;
}
 
//输出:------ every programmer should know memset!


四、memcmp()


函数原型


int memcmp ( const void * ptr1, const void * ptr2, size_t num );


参数说明


  • 比较ptr1和ptr2指针开始的num个字节。


  • ptr1和ptr2分别是两个代表要比较的内存空间(一般是数组)的指针。


  • num是要比较的字节数。(注意:不是元素个数)。


使用说明


  • 返回值为整型,若返回值>0,则ptr1的内存长度大于ptr2;若返回值==0,则二者相等;若返回值<0,则ptr1的内存长度小于ptr2


使用示例


//示例来自cplusplus官网
 
/* memcmp example */
#include <stdio.h>
#include <string.h>
 
int main ()
{
  //创建两个要用作比较的数组
  char buffer1[] = "DWgaOtP12df0";    
  char buffer2[] = "DWGAOTP12DF0";
  
  //接受比较的结果
  int n;
 
  //要比较的字节数为buffer1的长度
  //两字符串的比较可以用strcmp(buffer1,buffer2)函数实现,原理大致相同。
  n = memcmp ( buffer1, buffer2, sizeof(buffer1) );
 
  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
 
  return 0;
}



相关文章
|
2月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
41 3
|
22天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
50 6
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
2月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
2月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
377 1
|
2月前
|
程序员 C语言
C语言内存函数精讲
C语言内存函数精讲
|
2月前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
41 0
|
2月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
48 0
|
2月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
79 0