memset以字节为单位操作

来源:互联网 发布:淘宝买东西扣了两次钱 编辑:程序博客网 时间:2024/05/13 01:20

把数组中的元素值都设置成字符1,

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <cstring>
usingnamespace std;
int main(){
    chara[5];
    memset(a,'1',5);
    for(inti = 0;i < 5;i++)
        cout<<a[i]<<" ";
    system("pause");
    return0;
}

而,如下程序想把数组中的元素值设置成1,却是不可行的
因为第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用 memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cstring>
#include <windows.h>
usingnamespace std;
int main()
{
    inta[5];
    memset(a,1,20);//如果这里改成memset(a,1,5*sizeof(int))也不可以,因为memset按字节赋值。
    for(inti = 0;i < 5;i++)
        cout<<a[i]<<" ";
    system("pause");
    return0;
}


这个错误严格来讲不能算用错memset,但是它经常在使用memset的场合出现

1
2
3
4
5
6
7
int some_func(struct something *a)
{
    
    
    memset(a,0,sizeof(a));
    
}
这里错误的原因是VC函数传参过程中的指针降级,导致sizeof(a),返回的是一个 something*指针类型大小的的字节数,如果是32位,就是4字节。

原创粉丝点击