void *memset(void * s, int ch, size_t n);
功能: 将s指向的一块连续内存中的前 n 个字节的内容全部设置为ch指向的ASII值 (ASII值可以用一个字节 8位来表示)
(对应的s指向的元素都是 将 ch代表的ASII值 将数组里面的元素 以字节为单位进行赋值(无论该数组元素是char 还是其他int什么的 )。赋值
一.常见使用memset初始化非char类型数组错误
char buff[20];
memset(buffer,0,sizeof(buff) );
以上将buffer数组里面的元素全部赋值为0对应的ASII值
误以为对s指向的元素全部赋值为 ch
int num[20];
memset(num,0,sizeof(num) );
这里将num数组里面的元素全部赋值为了 0,但是要注意memset函数的原理;
这里是将 20*4个字节里面的内容全部赋值为0,由于0对应的一个字节二进制码为 0000 0000,int变量一般对应4个字节,所以int数组里面的元素的4个字节全部赋值未 0000 0000 ,那么int型元素全部赋值为 0000 0000 0000 0000 0000 0000 0000 0000 对应的数字为0 达到全部初始化为0的效果 。
memset(num,0,sizeof(num) ); //错误 ,达不到将num里面的int元素全部赋值为1
以上的蓝色字体已经说过,该函数的赋值过程是以字节未单位的;
所以上面这一行代码是将 1 对于的ANSII值 (字节 二进制为0000 0001,即为1 ) 以该字节单位对数组及里面的所有元素赋值;
以单个元素为例子: num[0] 对应的4 个字节 全部赋值为 0000 0001 那么num[0] 被赋值为 0000 0001 0000 0001 0000 0001 0000 0001 ,对应的数为 2^0 + 2^8 + 2^16 + 2^24 = 16843009 其他元素也全部被赋值为 16843009 因此达不到全部赋值为1的结果
因此,只有当 ch 为 0 或 -1时达到元素全部赋值为0 或 -1 ,原因 0 对应字节的二进制全部为0 即0000 0000 ; 1对应的字节二进制全部为1 即 1111 1111 (补码)
二.使用memset函数初始化的几种形式
1.初始化字符数组
char buff[20];
memset(buff,65,sizeof(buff));
将buff里面的每个字符元素初始为 3 所对应ASII字符为 'A'
char buff[20];
memset(buff,'A',sizeof(buff));
将buff里面的每个字符元素初始为 'A'2.初始化int整型数组
初始化 只能将 0或者-1 直接赋值为想要的初始值 具体原因参考上面写的错误
int num[20];
memset(num,0,sizeof(num));
memset(num,-1,sizeof(num));
一般初始化为0 比较常见 所以采用memset函数进行初始化,如果初始化为非0或-1 建议使用for循环依次赋值3.初始化结构体类型变量或数组
struct sample_struct
{
char csName[16];
int tiSeq;
int tiType;
};
对于变量
struct sample_struct stTest;
一般情况下,清空stTest的方法
stTest.csName[0] = {'\0'};
stTest.tiSeq = 0;
stTest.tiType = 0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是数组:
struct sample_struct TSET[10];
memset(TEST,0,sizeof(struct sample_struct) * 10);
例外结构体里还有数组的话还是需要单独进行初始化处理的