最近在实现差分进化算法的时候,发现数据异常,查了好久,才知道是memset惹的祸!

#include <iostream>
#include <cstring>
using namespace std; void f(int s[])
{
memset(s, , sizeof(s));
} int main()
{
int s[] = {,,,,}; f(s); for (int i = ; i < ; ++i)
cout << s[i] << ' '; cout << endl; system("pause");
}

上面这段程序的输出竟然是:0 2 3 4 5

就是说memset只清空了第一个元素,Ohshit!

所以将数组当作参数传递的时候,不要用memset,memset应该和数组在同一块代码区。

Why?中大黑熊提示:

静态数组作为参数传入某个函数的时候,就会退化成指针,也就是该数组的首地址,其数组的长度信息就丢掉了,这就是在这个语境下退化的概念。

这也是为什么在将数组作为参数传递时,同时要将数组的长度也一并传入的原因。

当然除了再传递一个数组长度给函数这种方法来防止数组退化成指针之外,还有1种方法是使用数组的引用,加多一个'&'就可以了。

所以这个不是memset的错……memset对不起。

顺便提一提以前的小陷阱,用memset将int,bool数组置为0是可以的,但置为1是不行的;将char数组置为'1'是可以的。

Why?

memset是按字节赋值,char是字节,int是4个字节,所以char是可以的,int是不行的。(可以输出sizeof(char), sizeof(int)查看)

memset第一个参数是开始填充的地址,第二个参数是填充的byte,第三个参数要填充的字节数(注意是字节数)。

比如置为1,那么赋值的结果应该是00000001000000010000000100000001,为16843009。

通俗的讲,就是将1变为00000001,然后从数组头开始,每8位填充一个00000001,直到填充的次数等于第三个参数。最后如果是int,那就按Int的位数取出来,得到16843009。

#include <iostream>
#include <cstring>
using namespace std; int main()
{
int s[] = {,,,,}; memset(s, , sizeof(s)); for (int i = ; i < ; ++i)
cout << s[i] << ' '; cout << endl; system("pause");
}

程序的输出是:16843009 16843009 16843009 16843009 16843009

如果是置为0,那么全部都是0,所以还是0哈~

因为0全部都是0,所以可以,那么全部是f呢,答案就是-1,全部初始化为-1也是可以的。

memset陷阱的更多相关文章

  1. 洛谷P1156 垃圾陷阱[背包DP]

    题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...

  2. P1156 垃圾陷阱 DP

    题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2 \le D \le 100)D(2≤D≤100)英尺. 卡门 ...

  3. HDU 2555 陷阱(模拟,结构体数组)

    这道题目意思很明白,有不确定的数据沙包和陷阱,还要排序···那就必须要用结构体+数组 /* 在地面上有N 个大小不等的长方形陷阱,每个陷阱的周长各不相同,每个参赛者都有一个沙包,闭上眼睛把它扔向地面, ...

  4. 【题解】P1156垃圾陷阱

    [题解]P1156 垃圾陷阱 乍看此题,我们感觉状态很多,很复杂. 遇到这类型条件比较多的\(dp\),我们不要首先考虑全部设出来,而是要看到这些状态的本质.而在这道题目中,时间和高度就是关键. 考虑 ...

  5. 【2018寒假集训 Day2】【动态规划】垃圾陷阱(挖坑等填,未完成)

    垃圾陷阱 (well) 卡门--农夫约翰极其珍视的一条Holsteins奶牛--已经落了到"垃圾井"中."垃圾井"是农夫们扔垃圾的地方,它的深度为D (2 &l ...

  6. luogu1156垃圾陷阱题解--背包DP

    题目链接 https://www.luogu.org/problemnew/show/P1156 方法1 分析 将已经爬的高度看作背包容积,最大剩余血量看作价值,\(f[i][j]\)表示吃完第\(i ...

  7. C陷阱与缺陷学习笔记

    导读 程序是由符号(token)序列所组成的,将程序分解成符号的过程,成为"词法分析". 符号构成更大的单元--语句和声明,语法细节最终决定了语义. 词法陷阱 符号(token)指 ...

  8. C/C++陷阱与套路,当年就是折在这些地儿…

    摘要:本文结合作者的工作经验和学习心得,对C++语言的一些高级特性,做了简单介绍:对一些常见的误解,做了解释澄清:对比较容易犯错的地方,做了归纳总结:希望借此能增进大家对C++语言了解,减少编程出错, ...

  9. 你可能不知道的陷阱, IEnumerable接口

    1.  IEnumerable 与  IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...

随机推荐

  1. Unity3D优化之合并网格

    原文地址点击这里

  2. NoSQL的CURD结构体的定义

    NoSQL的CURD结构体的定义 flyfish 2015-7-23 參考MongoDB Wire Protocol  在这里document部分使用json表示 使用boost::property_ ...

  3. github 管理图示

  4. 【jquery的setTimeOut定时器使用】

    目的:用户提交表单,一直触发校验事件. 1.效果: 2.代码: <!-- 去掉必填提示 --> <script type="text/javascript"> ...

  5. 将项目从tomcat 迁移到JBoss5.0

    http://java-boy.iteye.com/blog/531411从Tomcat升级到JBoss5.1真是一个痛苦的过程,可能遇到很多问题.以下是我碰到的问题,及解决方法. 一.Hiberna ...

  6. JS正则表达式(转载)

    在JavaScript中,RegExp对象表示正则表达式,用来对字符串进行匹配. 一.两种定义方法: 1.直接量法: /pattern/attribute 2.对象法: new RegExp(patt ...

  7. python代码 构建验证码

    1.python代码编写 (随机验证码): #coding: utf-8 import Image, ImageDraw, ImageFont, ImageFilter import string, ...

  8. JAVA 并发编程-应用篇

    提到java多线程不免有些人会头大.非常多概念都是非常理解可是真正到了实战的时候又是不知道怎样操作了.以下就结合实际项目来说说多线程的应用. 业务需求: 举例:批量插入10万条用户的相关活动优惠券 操 ...

  9. Xgboost 模型保存和载入()

    https://blog.csdn.net/u012884015/article/details/78653178 xgb_model.get_booster().save_model('xgb.mo ...

  10. 教程:VS2010 之TFS入门指南(转载)

    [原文发表地址] Tutorial: Getting Started with TFS in VS2010 [原文发表时间] Wednesday, October 21, 2009 1:00 PM 本 ...