memset函数

常见错误:
第一: 搞反了 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,能够这样清零:
若是是一个 结构体数组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就很是方便:
若是是数组:
另外:
若是 结构体中有 数组的话仍是须要对数组单独进行初始化处理的。
相关文章
相关标签/搜索