memset陷阱
最近在实现差分进化算法的时候,发现数据异常,查了好久,才知道是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陷阱的更多相关文章
- 洛谷P1156 垃圾陷阱[背包DP]
题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想把垃圾堆起来,等到 ...
- P1156 垃圾陷阱 DP
题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2 \le D \le 100)D(2≤D≤100)英尺. 卡门 ...
- HDU 2555 陷阱(模拟,结构体数组)
这道题目意思很明白,有不确定的数据沙包和陷阱,还要排序···那就必须要用结构体+数组 /* 在地面上有N 个大小不等的长方形陷阱,每个陷阱的周长各不相同,每个参赛者都有一个沙包,闭上眼睛把它扔向地面, ...
- 【题解】P1156垃圾陷阱
[题解]P1156 垃圾陷阱 乍看此题,我们感觉状态很多,很复杂. 遇到这类型条件比较多的\(dp\),我们不要首先考虑全部设出来,而是要看到这些状态的本质.而在这道题目中,时间和高度就是关键. 考虑 ...
- 【2018寒假集训 Day2】【动态规划】垃圾陷阱(挖坑等填,未完成)
垃圾陷阱 (well) 卡门--农夫约翰极其珍视的一条Holsteins奶牛--已经落了到"垃圾井"中."垃圾井"是农夫们扔垃圾的地方,它的深度为D (2 &l ...
- luogu1156垃圾陷阱题解--背包DP
题目链接 https://www.luogu.org/problemnew/show/P1156 方法1 分析 将已经爬的高度看作背包容积,最大剩余血量看作价值,\(f[i][j]\)表示吃完第\(i ...
- C陷阱与缺陷学习笔记
导读 程序是由符号(token)序列所组成的,将程序分解成符号的过程,成为"词法分析". 符号构成更大的单元--语句和声明,语法细节最终决定了语义. 词法陷阱 符号(token)指 ...
- C/C++陷阱与套路,当年就是折在这些地儿…
摘要:本文结合作者的工作经验和学习心得,对C++语言的一些高级特性,做了简单介绍:对一些常见的误解,做了解释澄清:对比较容易犯错的地方,做了归纳总结:希望借此能增进大家对C++语言了解,减少编程出错, ...
- 你可能不知道的陷阱, IEnumerable接口
1. IEnumerable 与 IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...
随机推荐
- 关于ThreadLocal变量的一个坑
每个线程都有一个ThreadLocalMap对象,ThreadLocalMap是Thread的一个内部类,可以把ThreadLocalMap理解成一个Map,这个Map里存放这一个Thread的所有线 ...
- jmeter ---测试TCP服务器/模拟发送TCP请求
jmeter测试TCP服务器/模拟发送TCP请求 jmeter测试TCP服务器,使用TCP采样器模拟发送TCP请求. TCP采样器:打开一个到指定服务器的TCP / IP连接,然后发送指定文本并等待响 ...
- laravel的表单验证(下面有些信息未验证,转的)
后台写法: 1.1类的方法 $rules = [ 'email'=>'required|between:4,20', 'password'=>'required|between:6,20' ...
- Mongodb更新数组$sort操作符
db.students.update( { _id: 1 }, { $push: { quizzes: { $each: [ { id: 3, score: 8 }, { id: 4, score: ...
- 关于scut在unity上的主动推送
自带的samples里面,chat的例子涉及主动推送,可作为参考. 在unity里面接收主动推送用Net.CommonCallback 服务端最近的新版本更改了接口,有两种方法推送: ActionFa ...
- Atitit.ati orm的设计and架构总结 适用于java c# php版
Atitit.ati orm的设计and架构总结 适用于java c# php版 1. Orm的目标1 1.1. 动态obj1 1.2. Hb的api(meger,save,update,del)1 ...
- redis源码学习_简单动态字符串
SDS相比传统C语言的字符串有以下好处: (1)空间预分配和惰性释放,这就可以减少内存重新分配的次数 (2)O(1)的时间复杂度获取字符串的长度 (3)二进制安全 主要总结一下sds.c和sds.h中 ...
- 李洪强iOS开发OC[001]-NSLog函数的使用方法
- CentOS6.2下安装Qt5.1.0
因为要将程序实现跨平台,所以只能在CentOS6.2上再安装一次Qt,为了保证一致性,我使用了和windows下版本一样的Qt5.1.0,可以到此处下载. 下载好,复制到虚拟机上后,直接双击运行,一切 ...
- Struts1小案例问题教训总结(含中文乱码问题及解决)
1. 提交form后页面空白,没有任何显示,Debug发现form的validate()以及action的execute()根本没有被调用. 原因:validate()和execute()有2个互为o ...