⒉其实不然!特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个
试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)
问题是:
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就非常方便:
如果是数组:
则
另外:
如果
结构体中有
数组的话还是需要对数组单独进行初始化处理的。