memset函數及注意事項

  memset函數的原型爲:void * memset(void *ptr,int value,size_t num);用於爲地址ptr開始的num個字節賦值value。數組

  memset函數的頭文件爲:C:<memory.h>或<string.h>    C++:<cstring>。函數

  在用memset爲申請的數組賦值時,若是瞭解他的賦值原理,頗有可能會形成一些沒必要要的隱形錯誤,使人頭疼不已。memset函數在爲數組(單個變量也能夠)賦值時,是逐個字節賦值的,ptr開始的num個字節中的每一個字節都賦值爲value。因此咱們就要注意了:blog

  (1)若ptr指向的是char型地址,value能夠爲任意字符值。(由於一個字符佔一個字節);原型

  (2)若ptr指向的非char型地址(即最小存儲單位不是一個字節的數據類型),如int型地址,要想賦值正確,value的值只能是-1或0,由於-1和0轉換爲二進制後每一位都是同樣的,這裏假設int型佔四個字節,則-1=0XFFFFFFFF,0=0X00000000。string

  例:正確賦值:變量

        int a[10];原理

        memset(a,-1,sizeof(a));數據類型

 

  賦值後a中元素爲:0xFF 0XFF 0XFF 0XFF。由於int型佔四個字節,memset的賦值方式是逐個字節進行賦值,因此元素的值其實是四個字節合在一塊兒的值:0XFFFFFFFF=-1。二進制

  例:錯誤賦值:im

        int a[10];

        memset(a,1,sizeof(a));

  賦值後a中元素爲:0X01 0X01 0X01 0X01,即:0X01010101=16843009。

相關文章
相關標籤/搜索