memset函数的赋值问题

memset函数的赋值问题


memset函数的定义

在C++标准库中对memset函数的定义为:

定义于头文件 cstring。

转换值 ch 为 unsigned char 并复制它到 dest 所指向对象的首 count 个字节。

若该对象是潜在重叠的子对象或非可平凡复制 (TriviallyCopyable) (例如标量、 C 兼容的结构体或可平凡复制类型的数组),则行为未定义。

若 count 大于 dest 所指向的对象大小,则行为未定义。

void* memset( void* dest, int ch, std::size_t count );

其中参数dest指向要填充的对象的指针,ch为填充字节,count为填充的字节数。返回值为dest。

对一维数组或字符组赋值

memset的作用是将某一块内存中的内容全部设置为指定的值,是按字节对内存块进行初始化。memset的时候是一个字节一个字节设置的,设置参数为ch,然后取该参数二进制表示下的低八位进行按字节赋值,例如

int a[5];
memset(a, 1, sizeof(a));

这里int为32位,即四个字节,如果用memset置1,二进制的1为0000 0001,按字节填充,那对于每一个数组a的元素,设置了0000 0001 0000 0001 0000 0001 0000 0001,其值不为1,而对于0和-1,0的二进制为0000 0000 0000 0000 0000 0000 0000 0000,-1的二进制为1111 1111 1111 1111 1111 1111 1111 1111,所以对于0和-1,每个字节都是一样的,可以正确赋值,所以一维整数类型数组只能赋值为0或-1。

对于一维字符组

char a[5];
memset(a, 'b', sizeof(a));

char类型是8位,即一个字节,用memset对char类型按字节赋值不会出现错误。

对二维组赋值

对二维组赋值是一样的,整型数组只能赋值0或-1,字符数组按字节赋值,不会出现错误。

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int a[5][5];
    memset(a, 0, sizeof(a));
    for(int i=0; i<5; i++)
    {
        for(int j=0; j<5; j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }

    return 0;
}

注意如果数组的地址不是连续的就会出现错误,因为memset是按字节进行赋值的。

posted @ 2022-09-23 17:57  HD0117  阅读(284)  评论(0编辑  收藏  举报