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;
}



相关文章
|
5天前
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
10分钟让你学会内存函数:memcpy,memmove,memset,memcmp的用法及模拟实现。
10 2
|
1天前
|
C语言
【C语言】:4大内存函数
【C语言】:4大内存函数
7 2
|
1天前
|
C语言
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
8 0
|
2天前
|
C语言
C语言内存函数
C语言内存函数
2 0
|
4天前
|
C语言 C++
C语言----C语言内存函数
C语言----C语言内存函数
|
10天前
|
消息中间件 存储 Kafka
实时计算 Flink版产品使用问题之 从Kafka读取数据,并与两个仅在任务启动时读取一次的维度表进行内连接(inner join)时,如果没有匹配到的数据会被直接丢弃还是会被存储在内存中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
10 2
|
5天前
|
存储
数据在内存中的存储(2)
数据在内存中的存储(2)
21 5
|
5天前
|
存储 小程序 编译器
数据在内存中的存储(1)
数据在内存中的存储(1)
23 5
|
6天前
|
存储 安全 Java
SpringSecurity6从入门到实战之初始用户如何存储到内存
Spring Security 在 SpringBoot 应用中默认使用 `UserDetailsServiceAutoConfiguration` 类将用户信息存储到内存中。当classpath有`AuthenticationManager`、存在`ObjectPostProcessor`实例且无特定安全bean时,此配置生效。`inMemoryUserDetailsManager()`方法创建内存用户,通过`UserDetails`对象填充`InMemoryUserDetailsManager`的内部map。若要持久化到数据库,需自定义`UserDetailsService`接口实