首页 > 代码库 > memset函数用法及注意事项

memset函数用法及注意事项

头文件
#include<cstring>


------------------------------------------


在memset使用时要千万小心,在给char 以外 的数组赋值时,
     只能初始化为0或者-1。    (看最后的0和1的补码)
///////////      给bool类型数组可以初始化1
------------------------------------------


头文件#include<cstring>
int arr[100];
memset(arr,0,sizeof(int)*100);
arr是数组的首地址,0就是要将这些地址的内容赋值为0,sizeof(int)求出int类型的长度,
乘以100就表示arr数组的整个长度。


也可以这样  ------
     memset(arr,0,sizeof(arr));


------------------------------------------






memset函数用法及注意事项memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的。
其原型是:void* memset(void *_Dst, int _Val, size_t _Size);
使用时在文件头加上#include "stdlib.h" 。
_Dst是目标起始地址,_Val是要赋的值,_Size是要赋值的字节数 。


例1:


       char str[9];
       我们用memset给str初始化为“00000000”,用法如下
       memset(str,0,8);
注意,memset是逐字节 拷贝的。
下面再看一个例子:
    例2:
      int num[8];
       我们用memset给str初始化为{1,1,1,1,1,1,1,1},


       memset(num,1,8);//这样是不对的


     一个int是4个字节的,8个int是32个字节,所以首先要赋值的长度就不应该为8而是32。
     因为memset是 逐字节 拷贝,以num为首地址的8字节空间都被赋值为1,
     即一个int变为0X00000001 00000001 00000001 00000001,
    显然,把这个数化为十进制不会等于1的。


     所以,在memset使用时要千万小心,在给char以外的数组赋值时,
     只能初始化为0或者-1。    (看最后的0和-1的补码)


因为在计算机里,0的二进制都是0,-1的二进制都是1。


     最近才发现memset的这个问题,之所以要写这篇文章,是因为我在自己的DES算法里多处用到了memset,而我当时却不知memset有这个问题,特此记下,引以为鉴。


---------------------
例如:


#include "stdio.h"
#include <string.h> 
int main()

   char s[100]="Golden Global View";
   memset(s,‘G‘,6); 
   printf("%s",s);  
   getchar(); 
   return 0; 



结果


----------
GGGGGG Global View
----------


----------------------------------------------------------------------
补码+0和-0相同?


我知道+0和-0补码相同,可是比如在八位机上,
+0(00000000)求补码是10000000,
而-0(10000000)求补码是(00000000)啊,
求补码的做法是符号位不变,其余为取反,然后再加1,
没错吧,那我的错误出在哪里?


----------
提问者采纳 


就没有正确的地方,在计算机中是不存在正负零之分的.
而你对补码理解又有错误的.补码只不过是用来表示带符号数而已.
补码的原则是:
   正数的补码是其本身,也就是原码.
   负数的补码是各位取反后加1.也就是其反码加1.
   +0的补码就是其原码,也就是说是0000 0000而已(对于8位来说)
   -0的补码是其反码加1,其反码是1111 1111,
   当然,其反码加1后就是溢出一个进位后,仍然是0000 0000.


----------------------------------------------------------------------










--------------------------------------------------------------------------------
请问-1的二进制如何表示?


不知道是1000000000000001    还是1111111111111111
我觉得是第一个,首位代表符号,0代表正、1代表负,剩下的代表实际数值,
为什么在C语言里第二个是-1呢


--------------------
提问者采纳




第一个是原码的话,
表示的也是-1第二个是补码表示的-1,
补码即原码除符号位外,全部取反+1
1000000000000001取反后是1111111111111110,再+1即1111111111111111 
C里面数是以补码方式来储存的


--------------------------------------------------------------------------------