C语言memset函数详解与误用

 

memset为内存填充函数,包含在<string.h>头文件中,可以用它对一片内存空间进行初始化,其原型为  
void *memset(void *s, int v, size_t n);  
英文释义如下: 
Copies the value v (converted to type unsigned char) to the first n bytes pointed to by s; returns s.  
这里s可以是数组名,也可以是指向某一内在空间的指针;v为要填充的值;n为要填充的字节数,通常为sizeof(s); 

使用memset时要注意的是,memset是逐字节进行填充,所以s一般为char *型。

对于其它类型的s,可以填充的值有两个,0和-1。这是因为计算机中用二进制补码表示数字,0的二进制补码为全0,-1的二进制补码为全1。如果要初始化为其它的值,可以用一个for循环,如下:

 for (int i=0; i<n; i++)

     s[i] = v; 

  

memset() 函数常用于内存空间初始化。如:  
char str[100]; 
memset(str,0,100);

 

memset可以方便的清空一个结构类型的变量或数组。

  如:

  struct sample_struct

  {

  char csName[16];

  int iSeq;

  int iType;

  };

  对于变量

  struct sample_strcut stTest;

  一般情况下,清空stTest的方法:

  stTest.csName[0]='/0';

  stTest.iSeq=0;

  stTest.iType=0;

  用memset就非常方便:

  memset(&stTest,0,sizeof(struct sample_struct));

  如果是数组:

  struct sample_struct TEST[10];

  则

  memset(TEST,0,sizeof(struct sample_struct)*10);

  

对于赋特定的值,需注意

 

 char a[5]; 
     memset(a,1,5);  //成功赋值为0x01

     int a[5]; 
     memset(a,1,5);//这里改成memset(a,1,5 *sizeof(int))也是不可以的 

   因为第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的。 
 而第二个程序a是整型的,使用memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值