memset函数用法精解

C语言memset()函数详解 传递时,每个字节都将被设置为该值的低字节。如果要给整型数组赋值,建议使用循环遍历数组并逐个为数组元素赋值的方式,以确保每个数组元素都被正确设置。通过指定要设置的值,可以灵活地将其应用于不同类型的数据结构和内存块。函数时要保证操作的内存块有效并且足够大,以避免访问非法内存区域或导致缓冲区溢出等问题。是一个 C 语言中的库函数,用于将指定的内存块设置为指定的值。函数的主要功能是将指定的内存块的每个字节设置为给定的值。需要注意的是,我们传递的是结构体变量的地址(的所有元素设置为 0。的所有元素设置为 10。 阅读详情

memset函数用法精解

1.基本介绍:

需要的头文件

在C中 <string.h>

在C++中 <cstring>


2.函数原型:

void *memset(void  *s,int ch,size_t n);
函数解释:将s中后n个字节(typedef unsigned int size_t)用ch替换并返回s.
函数作用:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快的方法。

3.常见错误:

3.1.搞反了ch和n的位置:
一定要记住如果要把一个char[20]清零,一定是memset(a,0,20),而不是memset(a,20,0)。

3.2过度使用memset:
我想这些程序员可能有某种心理阴影,他们惧怕未经初始化的内存,所以他们会写这样的代码:
char buffer[20];
memset(buffer,0,sizeof(char)*20);
strcpy(buffer,"123");
这里的memset是多余的,因为这块内存马上就被覆盖了,清零没有意义。

3.3特别是对于字符类型的,剩余的部分通常是不会为0的,不妨做一个试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)

比较下面两个Demo:
#include<stdio.h>
#include<string.h>
int main()
{
	char a[5];
	int i;
	memset(a,'1',5);
	for(i=0;i<5;i++)
	{
		printf("%c ",a[i]);
	}
	printf("\n");
	return 0;
}


#include<stdio.h>
#include<string.h>
int main()
{
	int a[5];
	int i;
	memset(a,1,5);             /*如果这里改成memset(a,1,5*sizeof(int))也不可以,因为memset按字节赋值*/
	for(i=0;i<5;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	return 0;
}



重点来了:
第一个程序为什么可以,而第二个不行?
1.因为第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用memset还是按字节赋值,这样赋完值以后,每个数组元素的值实际上是ox01010101即十进制的16843009。
2.如果用memset(a,1,20);(实际上与memset(a,1,5*sizeof(int))的结果是一样的)
请看下面代码:
#include<stdio.h>
#include<string.h>
int main()
{
	int a[5];
	int i;
	memset(a,1,20);             /*如果这里改成memset(a,1,5*sizeof(int))也不可以,因为memset按字节赋值*/
	for(i=0;i<5;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	return 0;
}

就是对a指向的内存的20个字节进行赋值,每个都是用ASCII为1的字符去填充的,转为二进制后,1就是00000001,占一个字节。一个int元素是4字节,合在一起就是00000001  00000001  00000001  00000001 ,就等于16843009,就完成了对一个int元素的赋值了。

再来两个例子加深理解:
#include<stdio.h>
#include<string.h>
int main()
{
	int a[5]={1,4,3,5,2};
	int i;
	printf("清零前:\n");
	for(i=0;i<5;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	memset(a,0,5*sizeof(int));          /*注意这里与上面的程序不同*/
	printf("清零后:\n");
	for(i=0;i<5;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	return 0;
}



#include<stdio.h>
#include<string.h>
int main()
{
	int a[5]={1,4,3,5,2};
	int i;
	printf("重新赋值前:\n");
	for(i=0;i<5;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	memset(a,1,5*sizeof(int));          /*注意这里与上面的程序不同*/
	printf("清零后:\n");
	for(i=0;i<5;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	return 0;
}


一次搞定memset函数! memset函数,一篇速通! 阅读详情

相关推荐

C语言积累整理---memset函数详解

memset是计算机中C/C++语言初始化函数。 作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。 每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。 它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为: # include <string.h> void *memset(void *s, int c, unsigned long n); 函.

weixin_42682108的博客 9879

memset的用法详解

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

薛定谔的猫的博客 32万+

memset()函数的用法详解

前言 最近做题时突然想到用memset给数组的元素赋值100,但是发现结果和想象中的不一样 通过debug看到数组中的元素的值都为1684300900,而明明给它的是100,这是为什么呢,于是查阅了一下memset函数的用法和原理 memset()函数介绍 首先来看函数原型 void *memset(void *str, int c, size_t n) 解释:复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。 作用:是在一段内存块中填充某个给定的值,它是对较大的结构体或数

weiambt的博客 28万+

memset()相关使用

1、memset函数及其用法 每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。 它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为: # include <string.h> void *memset(void *s, int c, unsigned long n); 函数的功能是: 将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是

xuyin1204的博客 3万+

memset函数原型

在网上找到的很多资料说的都是MEMSET的使用注意事项,一直在找这个函数的原型,想从他本身研究一下,但是一直都没找到。这个也是无意间浏览网页时发现的,及时发布出来,供大家参考 memset: [cpp] view plaincopyprint?  void* cb_memset(void* buffer, int b, size_t size) {   assert(buff

zxdong0612的专栏 5675

手把手教你读懂蓝牙BQB射频测试报告:以PRBS9为例的实战分析

本文以蓝牙BQB射频测试中的PRBS9信号为例,提供了一份实战分析指南。文章深入解读了输出功率、调制特性、邻道泄漏等核心测试项,并分享了信号分析仪操作技巧、测试环境搭建要点及设备选型建议,旨在帮助工程师精准解读报告,高效定位问题,确保产品顺利通过认证。

weixin_29289821的博客 261

memset函数及其用法,C语言memset函数详解

定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构。在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”。 每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为: include <string.h> void *memset(void *s, int c, unsigned long n); 函数的

冯同学的博客 2万+

CAB单片机开发指南

CAB单片机开发使用指南,IDE安装及烧录注意事项

Zoebuxiangtian的博客 1558

memset函数的用法

memset(a,0,sizeof(a));//数组清零 https://blog.youkuaiyun.com/yangsen2016/article/details/1638503 1、void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。 2、例子 #include void main() { char *s=...

fighting123678的博客 6000

PCB工艺-SI9000使用教程

本文介绍了阻抗计算工具SI9000的使用方法,重点讲解了微带线与带状线的区别、共面阻抗概念及参考面选择。通过USB差分走线实例,详细说明了如何选择计算模型、填写参数并确定线宽线距。文章还提供了层叠设计资料和工厂常规阻抗表格作为参考,建议制板时标注需控阻抗的线路供板厂调整。最后简单提及了嘉立创阻抗计算工具作为备选方案。

weixin_50120208的博客 2024

数学建模国赛B题保姆级攻略:从选题到代码实现的完整流程(2024最新版)

本文提供2024年数学建模国赛B题的保姆级实战攻略,涵盖从赛题解构、模型构建到算法实现与论文撰写的完整流程。文章详细解析了如何快速抓住问题核心、建立数学模型、进行算法求解与结果可视化,并分享了高效团队协作与专业论文写作的关键技巧,助力参赛者系统性地完成从选题到代码实现的全过程。

weixin_29089057的博客 139

C++中memset函数的用法

memset 函数是内存赋值函数,用来给一块指定内存空间进行赋值的。 1、可以用它对一片内存空间逐字节进行初始化 2、其函数原型如下: void* __cdecl memset(void* _Dst,int _Val,int _Size); _Dst:为数组名,也可以是指向某一内存空间的指针 _v:为要填充的值 _Size:为要填充的字节数 3、示例如下: #include...

Jeffxu_lib的博客 9062

Codex 接入国产大模型完整指南:CC-Switch 与 Codex++ 的工程化选型

Codex 默认走 OpenAI Responses API,而 DeepSeek、GLM、Kimi 等国产模型只提供 OpenAI-compatible 的 Chat Completions——两套协议在消息结构、流式响应、reasoning 字段、tool call 上都不兼容,所以"改个 Base URL + 填国产 Key"这种朴素操作根本跑不通。本文从架构师视角出发,把 Codex 接入国产大模型这件事讲透:先剖析协议链路到底卡在哪,再对比 CC-Switch和 Codex++两套主流方案的差异

少说,多做 3853

memset函数的用法及常见错误

memset 函数的用法及常见错误 转载自https://blog.youkuaiyun.com/pugu12/article/details/46861923 转载自https://blog.youkuaiyun.com/qq_42991793/article/details/81751284 转载自https://baike.baidu.com/item/memset/4747579?fr=aladdin 文章目录m...

一叶知秋的博客 2343

OSG第三方库编译之二十一:minizip编译(Windows、Linux、Macos环境下编译)

OSG编译;第三方库;跨平台编译;minizip编译(Windows、Linux、Macos环境下编译)

LuckyHanMo的博客 2621

STM32(HAL库)驱动HC-SR04测距模块

本文介绍通过STM32F103C8T6单片机对HC-SR04测距模块进行驱动,并且通过串口对数据进行打印。

weixin_44597885的博客 2203

java memset函数_memset函数使用详解

今天做题卡在MEMSET函数的使用上了,本来以为int a[100]; memset(a, MAX,sizeof(a));就是将a数组全部赋值为MAX,现在才知道他的填充是以字节为单位,一般用于对字符型变量的初值进行赋值.1。void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。2。例子 #includevoid m...

weixin_42121412的博客 1574

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

memset用法 最详细用法解释

memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组, c:是赋给buffer的值, count:是buffer的长度. 这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer)) Memset ...

fucheng的博客 8241

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C函数之memset()函数用法

C函数之memset()函数用法1.功能:将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针2. 需要的头文件  or 3.函数原型: void *memset(v

冀博 2万+

memset函数用法

摘要(147字) memset是C/C++中用于按字节填充内存的函数,原型为void* memset(void* ptr, int value, size_t num)。其核心特性是按字节处理(取value低8位),常用于内存清零、字符数组初始化或结构体清零。使用时需注意: 非字符类型初始化非零值会导致意外结果(如int数组元素变为0x01010101); 越界访问会引发崩溃; 禁用场景:C++含虚函数或指针的类。 正确用法示例包括清零数组(memset(arr, 0, sizeof(arr))),错误用法

张佳航的博客 895

C++ memset函数用法

memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。 函数介绍 #include<string.h> void *memset(void *s, int ch, size_t n); memset解释:将s中当前位置后面的n个字节用ch替换并返回s。 memset作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 。 memset()函数原型是extern void *me

qq_45945867的博客 3387

c++ memset 语言_C++中memset函数用法详解

本文实例讲述了C++中memset函数用法。分享给大家供大家参考,具体如下:功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作用 法:void memset(void *s, char ch, unsigned n);程序示例:#include #include #include int main(v...

weixin_39677104的博客 347

C++中memset函数的基本用法

memset是将你指定范围的每一个字节设定为你指定的一个二进制值(在指定二进制时,以十进制的方式输入),在使用时要包含头文件。原型`void* memset(void* ptr, int value, size_t num);· ptr:指向要设置数值的内存起始位置的指针。· value:要设置的无符号字符值(通常是 unsigned char 类型的)。· num:要设置的字节数。

2301_80293417的博客 1955
上一篇: c语言将数据写入文件(用链表实现)
下一篇: 快速幂精解
一giao窝里giao
博客等级 码龄11年 37粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值