常见错误:
第一: 搞反了 ch 和 n 的位置.
必定要记住若是要把一个char a[20]清零,必定是 memset(a,0,20);而不是 memset(a,20,0);
第二: 过分使用memset,我想这些
程序员可能有某种心理阴影,他们害怕未经
初始化的内存,因此他们会写出这样的代码:
这里的
memset是多余的. 由于这块内存立刻就被所有覆盖,清零没有意义.
另:如下状况并很少余,因某些
编译器分配空间时,内存中默认值并不为0:
第三: 其实这个错误严格来说不能算用错memset,可是它常常在使用memset的场合出现
这里错误的
缘由是VC函数传参
过程中的
指针降级,致使
sizeof(a),返回的是一个 something*指针类型大小的的
字节数,若是是32位,就是4字节。
常见问题:
问:为什么要用memset置零?memset(&Address,0,sizeof(Address));常常看到这样的用法,其实不用的话,分配数据的时候,剩余的空间也会置零的。
答:1.若是不清空,可能会在测试当中出现野值。你作下面的试验看看结果()
这样写,有没有memset,输出都是同样
⒉其实否则!特别是对于字符指针类型的,剩余的部分一般是不会为0的,不妨做一个
试验,定义一个字符数组,并输入一串字符,若是不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,若是有,就默认字符结束,不会输出后面的乱码)
问:
以下demo是能够的,能把
数组中的
元素值都设置成字符1,
而,以下程序想把数组中的元素值设置成1,倒是不可行的
问题是:
1,第一个程序为何能够,而第二个不行?
由于第一个程序的数组a是
字符型的,字符型占据内存大小是1Byte,而memset函数也是以
字节为单位进行赋值的,因此你输出没有问题。而第二个程序a是整型的,使用memset仍是按字节赋值,这样赋值完之后,每一个数组元素的值其实是0x01010101即十进制的16843009。
2,不想要用for,或是while循环来初始化int a[5];能作到吗?(有没有一个像memset()这样的函数初始化)
若是用memset(a,1,20);(实际上与memset(a,1,5*sizeof(int))结果是同样的)就是对a指向的内存的20个字节进行赋值,每一个都用ASCⅡ为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一块儿是0000 0001,0000 0001,0000 0001,0000 0001,转化成十六进制就是0x01010101,就等于16843009,就完成了对一个INT元素的赋值了。
程序范例:
输出结果:
也不必定就是把内容所有设置为ch指定的ASCⅡ值,并且该处的ch可为int或者其余类型,并不必定要是char类型。例以下面这样:
输出的结果就是:
后面的表大小的参数是以
字节为单位,因此,对于int或其余的就并非都乘默认的1(字符型)了。并且不一样的机器上int的大小也可能不一样,因此最好用sizeof()。
要注意的是,memset是对
字节进行操做,因此上述程序若是改成
输出的结果就是:
为何呢?
由于memset是以
字节为单位就是对array指向的内存的4个字节进行赋值,
字节,合一块儿就是
就等于16843009,就完成了对一个INT元素的赋值了。因此用memset对非字符型
数组赋初值是不可取的!
若是是一个
结构体的
数组Some x[10],能够这样:
memset函数详细说明
1。void *memset(void *s,int c,
size_tn)
总的做用:将已开辟内存空间 s 的首 n 个
字节的值设为值 c。
2。例子
【以上例子出现内存访问冲突应该是由于s被当作
常量放入程序
存储空间,若是修改成 char s[]="Golden Global View";则没有问题了。】
【应该是没有问题的,字符串
指针同样能够,并非只读内存,能够正常运行】
【此实例能够正常编译运行,并不像楼主说的须要char s[]】
【memset(s,'G',6)这样是存在内存访问冲突的,由于s为常量字符串,不能修改的】
3。memset() 函数经常使用于内存空间初始化。如:
4。memset()的深入内涵:用来对一段内存空间所有设置为某个字符,通常用在对定义的字符串进行初始化为‘memset(a,'\0',sizeof(a));
5。补充:一点技巧
memset能够方便的清空一个结构类型的
变量或
数组。
如:
对于变量
通常状况下,清空stTest的方法:
用memset就很是方便:
若是是数组:
则
另外:
若是
结构体中有
数组的话仍是须要对数组单独进行初始化处理的。