memset的用法详解

memset的用法详解文章目录 memset 简介需要说明的几个地方不能任意赋值注意所要赋值的数组的元素类型关于所要赋值的字符数的写法具体用法实例总结 memset 简介 memset 是一个初始化函数 作用是将某一块内存中的全部设置为指定的值 void memset void s intc size tn s 指向要填充的内存块 c 是要被设置的值 n 是要被设置该值的字符数 返回类型是一个指向存储区 s 的指针 需要说明的几个地方不能任意赋值 memset 函数是按照字节对内存块进行初始化 所以不能用它将 in


memset简介

memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。

void *memset(void *s, int c, size_t n); 
  • s指向要填充的内存块。
  • c是要被设置的值。
  • n是要被设置该值的字符数。
  • 返回类型是一个指向存储区s的指针。

需要说明的几个地方

一、不能任意赋值

memset函数是按照字节对内存块进行初始化,所以不能用它将int数组出初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。
其实c的实际范围应该在0~255,因为memset函数只能取c的后八位给所输入范围的每个字节。也就是说无论c多大只有后八位二进制是有效的


二、注意所要赋值的数组的元素类型

先来看两个例子:
例一:对char类型的数组a初始化,设置元素全为’1’

int main(){ 
        char a[4]; memset(a,'1',4); for(int i=0; i<4; i++){ 
        cout<<a[i]<<" "; } return 0; } 

在这里插入图片描述

例二:对int类型的数组a初始化,设置元素值全为1

int main(){ 
        int a[4]; memset(a,1,sizeof(a)); for(int i=0; i<4; i++){ 
        cout<<a[i]<<" "; } return 0; } 

在这里插入图片描述

1、首先要说明的第一点

 对于第二个程序,数组a是整型的,一般int所占内存空间为4个字节,所以在使用memset赋值时,下面的语句是错误的

int a[4]; memset(a,1,4); 

由于memset函数是以字节为单位进行赋值的,所以上述代码是为数组a的前4个字节进行赋值,那么所得到的执行结果就只能是:
在这里插入图片描述
正确的memset语句应为:




memset(a,1,16); //int所占内存为4字节的情况 memset(a,1,sizeof(a)); 

至于为什么不是预期得到的1,将在下面的第二点进行说明。

当然,不同的机器上int的大小可能不同,所以最好用sizeof()函数

2、为什么第一个程序可以正确赋值1而第二个不可以?

这就又回到了刚刚说的第一个问题,memset函数中只能取c的后八位赋给每个字节

  • 第一个程序中,数组a是字符型的,字符型占据的内存大小就是1Byte,而memset函数也是以字节为单位进行赋值的,所以输出正确。
  • 第二个程序中,数组a是整型的,整型占据的内存大小为4Byte,而memset函数还是按照字节为单位进行赋值,将1(00000001)赋给每一个字节。那么对于a[0]来说,其值为(00000001 00000001 00000001 00000001),即十进制的。




关于所要赋值的字符数的写法

先来看一个示例:

#include 
           using namespace std; void fun1(int a[]){ 
          memset(a,-1,sizeof(a)); } int main(){ 
          int a[6]; fun1(a); for(int i=0; i<6; i++){ 
          cout<<a[i]<<" "; } return 0; } 

当数组作为参数传递时,其传递的实际上是一个指针,这个指针指向数组的首地址,如果用sizeof(a)函数得到的只是指针的长度,而不是数组的长度。

解决方案:
在函数中加入数组长度参数,在传递前先获取数组长度,然后将数组长度作为参数传递进去。

#include 
            using namespace std; void fun1(int a[], int len){ 
           memset(a,-1,len); } int main(){ 
           int a[6]; int len = sizeof(a); fun1(a,len); for(int i=0; i<6; i++){ 
           cout<<a[i]<<" "; } return 0; } 


具体用法实例

  • 初始化数组
char str[100]; memset(str,0,100); 
  • 清空结构体类型的变量
typedef struct Stu{ 
             char name[20]; int cno; }Stu; Stu stu1; memset(&stu1, 0 ,sizeof(Stu)); Stu stu2[10]; //数组 memset(stu2, 0, sizeof(Stu)*10); 

此外,如果结构体中有数组的话还是需要对数组单独进行初始化处理的。


总结

  memset函数在初始化处理时非常方便,但也有其局限性,比如要注意初始化数值,要注意字节数等等。当然,直接选择用for循环或while循环来进行初始化也是可以的,只不过memset更快捷一些。















版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199779.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 下午12:14
下一篇 2026年3月20日 下午12:14


相关推荐

  • pycharm怎么关闭科学模式_pycharm关闭科学模式

    pycharm怎么关闭科学模式_pycharm关闭科学模式PyCharm在2017.3版本之后加入了ScientificMode,在科学计算时,可以方便的追踪变量变化等。使用NumPy的时候,系统会提示usescientificmode,但进去后就运行程序的在控制台中,很麻烦,想改回来的话按下面步骤取反即可.有时打开了scientificmode时,但文件中引入了numpy等科学计算包时并没有被自动识别,以scientific…

    2022年8月27日
    6
  • Zynq DMA与Dcache一致性调试

    Zynq DMA与Dcache一致性调试0 背景 ZynqFPGA 的优势之一就是 PS 端与 PL 端基于高带宽的协同设计 以简化系统的硬件架构和提高系统的集成度和整体性能 例如 在某些硬件加速应用场合 PL 端需要与 DDR3 存储芯片进行高速率的数据交互 且通常都采用 DMA 方式实现的 PS 端集成 DMA 控制器硬件单元 CDMA PL 端有 AXIDMA 软核可以使用 整个数据交互通信链路的节点包含 5 个 CPU lt gt Dcache lt gt DDR3 lt gt

    2026年3月26日
    4
  • 2021全国大学生电子设计竞赛–电源–三相逆变(硬件)「建议收藏」

    2021全国大学生电子设计竞赛–电源–三相逆变(硬件)「建议收藏」废话不多说,直接上电路!三相逆变系统的框架如下::那么,降压电路不用多说,网上多得是1、下面说一下逆变驱动电路,也是通篇一律,这里贴上电路图,2、LC滤波器很多人会问我,LC如何选取,还有人在问,为啥我做出来之后发现电感在出声?答:第一个问题,网上可以搜得到,就是一个公式,以基波50HZ进行计算就行。第二个问题,有时候电感明明很大了,仍然出声音,其实那不是电感的问题,由于瓷片电容本身结构的问题,所以就睡导致在高频下的振荡出声,如果换成安规电容或者CBB就会…

    2022年5月25日
    44
  • _beginthread, _beginthreadex

    _beginthread, _beginthreadex语法uintptr_t_beginthread(//NATIVECODEvoid(__cdecl*start_address)(void*),unsignedstack_size,void*arglist);uintptr_t_beginthread(//MANAGEDCODEvoid(__clrcall*start_add…

    2025年6月15日
    4
  • java获取时间毫秒_java秒转换成时分秒

    java获取时间毫秒_java秒转换成时分秒有没有办法在几秒钟内获得当天的当前时间?注意我问的是当天的时间,而不是UTC时间。我想要的是0到86,400(12:00AM-11:59PM)之间的值(以秒为单位)。我正在开发一个每天工作的应用程序,当这一天结束时,时间(以秒为单位)应该再次重新开始0。所以我们说它是10:00AM。我应该得到36,000秒,如果我的时间是5:00PM,我应该得到61,200秒。PS:我不知道手头的时…

    2025年9月16日
    7
  • python deepdiff和pprint

    python deepdiff和pprintpythondeepdi 官方文档 https pypi org project deepdiff deepdiff 的作用详解 r DeepDiffcomm iterables stringsandal Itwi

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号