关于C语言中的memset()函数你了解多少

665a0afd52dab2c6cb230760da6b82ac.png

点击上方蓝字关注我,了解更多咨询

0b96702937f0ecf954bddb144247d7ad.png

1.函数原型及功能

memset()函数原型为:

cea206b7bc6f970fe86fb008b29ed46a.png

函数功能:将_Dst所指区域的前size_t个字节均初始化为_val,调用时需要引用string.h头文件

memset()函数多用于数组和结构体这种占用内存比较大的数据结构的初始化,如果没有对其进行初始化,常常会产生一些野值。

此外,读者可能对_cdcel和size_t比较陌生,这里稍微解释下,其中_cdecl表示C/C++和MFC程序默认使用的调用约定:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。(这里不详细说明,后续会写一篇关_cdecl、_stdcall、_fastcall的文章,读者可去我的主页查看),size_t是宏定义unsigned int或unsigned _int64的替换体

2.使用memset()函数

2.1 用memset()函数给数组初始化

f20bc82fa1f6aa4047455d3ec98b09a4.png

结果为:

f9794af35b1d41392086cf1639b0b19c.png

memset 一般使用0初始化内存单元,需要注意的是,memset()函数是对size_t个字节进行赋值,而int类型为4个字节,如果写成这样便是错误的:

d7e3f6759d76c1c0ad281b982db78ae4.png

正确写法为:

c82a6d519240a4f6b9d9dab65ec294b6.png

这等价于例中的写法

2.2 用memset()函数给结构体初始化

4873516d410116bee3eef43abdc95e57.png

通过memset()函数初始化要比挨个对结构体中成员初始化要方便很多。

如果是对结构体数组初始化的话:

44debde3e11783ecec818cbbbb23c3ad.png

3.容易忽视的错误

错误1:sizeof(指针)

先来看一个例子:

c274791368575b3c1596928af56da8aa.png

大家觉得结果是什么?是“0 0 0 0 0 0 0 0 0 0”吗?

错误,结果应该是:

9725c34c184e8a70a33f8992d5331161.png

为什么会这样?因为str是指针变量,无论str指向的是什么类型的变量,str终究只是存储了地址,sizeof(str)永远等于4!所以我们只将前面4个字节置为0,而后面的-52应该是乱码的表示,因为后面六个字节是没有初始化的(关于-52知道的读者可以在评论区留言

我们平常可以通过指针或数组名来操控数组元素的值,如str[i],a[i],*(str+i)都是正确的写法,但务必记住的是指针和数组名不完全相同,具体区别我会另写一篇文章讲解。

错误2:多字节类型变量赋非0值与想像的不同

还是来看一个例子:

0c006af119f7bfaba50447ee081ac8c0.png

大家觉得结果是什么呢?是“1 1 1 1 1 1 1 1 1 1”吗?

正确答案为:

2a9fe7aa8bbd97f864c9137ecaf01d9d.png

memset()函数赋值时,是对数组b的每个字节赋值,所以每个数组元素的值为:

3367d63d17510ee5e8cd0522b66726f7.png

转换为10进制便是16843009

c944e8829479428c0b48750946bb8013.png

END

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

49b21501d6e0e9f8d3c737c6f0861b82.png

7456f2f9d6dbd7e95d38468b38eee24e.gif

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何判断无法到达目标的拼图_拼图项目的动机和目标

如何判断无法到达目标的拼图几周前,我写了一篇关于Jigsaw项目可能如何破坏现有代码的文章 。 那么我们得到什么回报呢? 让我们看一下项目解决的痛点及其在Java 9中解决问题的目标。 系列 这篇文章是正在进行的有关拼图项目系列的一部分。 按照推荐的顺序…

deepin下载python_深度操作系统中怎样下载python?

需要以下4步:1、下载 2、获取权限 3、安装 4 、运行测试注意:千万不要卸载或者强制卸载原来自带的python,具体原因请看度娘的介绍!1、下载Python3.7.6:到官网下载https://www.python.org,在downloads中可以…

javafx显示image_JavaFX技巧20:有很多要显示的吗? 使用画布!

javafx显示imageJavaFX应用程序似乎有两种:第一种使用带有节点和CSS样式的场景图,第二种使用单个画布。 但是,将这两种方法混合使用是完全合法的。 尤其是当您的应用程序必须显示大量详细信息时,您很容易最终创建成千上万个节点。…

c语言中|的含义

点击上方蓝字关注我,了解更多咨询||在c语言中的意思是逻辑OR(或)运算,运算符两端有一个变量为真,则结果为真。比如a||b表示a和b做逻辑OR(或)运算,只要有任何一个变量为“真”&#x…

30 校准_校准or质控,傻傻分不清楚

今天发个福利,应kkz的要求,聊一聊我对IVD校准和质控的个人理解。非专业科普文,欢迎交流~先来讲个小故事:我小的时候,家里用的挂钟每隔一段时间就要调准一下。那个时候没有网络,爸妈是对着中央新…

jax-ws 生成soap_在Spring中记录JAX-WS SOAP消息

jax-ws 生成soap每当在Spring中使用JAX-WS时,您可能都希望记录传入和传出的SOAP消息-如果仅用于开发过程中的调试。 因此,第一件事就是增加日志级别,对吗? 不幸的是,这将无效。 您将要做的是利用javax.xml.ws.handler.…

C语言查找数组最大最小值

点击上方蓝字关注我,了解更多咨询C语言查询最大最小值的实现思路:定一个变量存储最大值或最小值,变量的初始值取自数组的第一个元素,然后遍历数组,如果遍历到的元素比变量的值大,就把值赋给变量&#xff0c…

c语言中%s的含义你知道吗?

点击上方蓝字关注我,了解更多咨询%s在C语言中代表字符串型格式符,一般用在printf、sprintf等字符串格式化函数中,用于决定格式化参数的数据类型。整数类型是%d,单精度浮点类型,也就是小数是%f,字符类型%c%c,%s这些代表…

mysql 1千万 like优化_MYSQL千万级数据量的优化方法积累

1、分库分表很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之…

1.0jpa 2.0_JPA 2.1如何成为新的EJB 2.0

1.0jpa 2.0美丽在于情人眼中。 “轻松”也是如此: 了解有关SQL结果集映射的更多信息,并轻松处理本机查询结果: http : //t.co/WH4BTlClIP #JPA #Java #JavaEE — Thorben Janssen( thjanssen123) 2015年4月15日 Tho…

C语言while循环要点你会吗

点击上方蓝字关注我&#xff0c;了解更多咨询while语句在使用过程需要注意几个要点&#xff1a;一、无限循环先来看看以下的代码示例int n 0;while(n<3)printf("n %d", n);n;执行代码后&#xff0c;循环输出n0。在上述代码中&#xff0c;虽然有n自增&#xff0c…

mysql performance tuning_MySQL Performance tuning

1.表级锁状态mysql> show status like table%;---------------------------------------| Variable_name | Value |---------------------------------------| Table_locks_immediate | 139306577 || Table_locks_waited | 0 || Tabl…

序列化加密字段_自动加密可序列化的类

序列化加密字段在Coursera安全顶峰项目的验尸讨论中提出了一个疯狂的想法。 类可以在序列化期间自行加密吗&#xff1f; 这主要是学术上的“假设”练习。 很难想到这样一种情况&#xff0c;我们希望在持久性期间依靠对象自加密而不是使用显式加密机制。 我只能确定一种情况&am…

C语言if与else匹配规则你知道多少?

点击上方蓝字关注我&#xff0c;了解更多咨询如果程序中有多个if和else&#xff0c;那如何配对&#xff0c;if和else的匹配规则简单总结为以下两点&#xff1a;1.无花括号&#xff0c;else和最近的if匹配2.有花括号&#xff0c;else和内含有if语句的第1个if语句匹配我们通过两个…

cobertura_Cobertura和Sonar 5.1的问题

cobertura最近&#xff0c;我有些麻烦&#xff0c;试图在我的Grails 2.4.4项目中使用Sonar 5.1。 我使用的是Groovy常用的东西&#xff1a; Gmetrics&#xff0c;Codenarc和Cobertura 。 对于Sonar数据库&#xff0c;我使用的是Postgres 9.4 。 声纳跑步者的日志文件给了我这个…

C语言中+=的含义你明白吗?

点击上方蓝字关注我&#xff0c;了解更多咨询c语言中是代表两个变量相加&#xff0c;并将答案记录在左边的变量里。比如xy实际代表的表达式为&#xff1a;xxy。这是c语言为了语言的简洁性推出的组合运算。常见的运算符都可以这样组合运算。一、源码演示&#xff1a;二、输出结果…

calcite mysql_Apache顶级项目 Calcite使用介绍

原标题&#xff1a;Apache顶级项目 Calcite使用介绍什么是CalciteApache Calcite是一个动态数据管理框架&#xff0c;它具备很多典型数据库管理系统的功能&#xff0c;比如SQL解析、SQL校验、SQL查询优化、SQL生成以及数据连接查询等&#xff0c;但是又省略了一些关键的功能&am…

C语言中「」的含义

点击上方蓝字关注我&#xff0c;了解更多咨询取决于在scanf中使用还是在printf中使用。在scanf中使用&#xff0c;则添加了*的部分会被忽略&#xff0c;不会被参数获取。例如&#xff1a;int a,b;char b[10];scanf("%d%*s",&a,b)&#xff1b;输入为&#xff1a;1…

maven和docker_Java EE,Docker和Maven(技术提示#89)

maven和dockerJava EE应用程序通常使用Maven构建和打包。 例如&#xff0c; github.com/javaee-samples/javaee7-docker-maven是一个琐碎的Java EE 7应用程序&#xff0c;它显示了Java EE 7依赖性&#xff1a; <dependencies><dependency><groupId>javax<…

mysql ondumplictcate_4.5万字手把手教你实现MySQL TB级数据存储!!

写在前面业界对系统的高可用有着基本的要求&#xff0c;简单的说&#xff0c;这些要求可以总结为如下所示。系统架构中不存在单点问题。可以最大限度的保障服务的可用性。一般情况下系统的高可用可以用几个9来评估。所谓的几个9就是系统可以保证对外提供的服务的时间达到总时间…