memset是初始化一段內存區域的函數,其頭文件是<string.h>,以前經常使用出現錯誤,整理一下。
C++ Reference對於memset的定義為:
void * memset ( void * ptr, int value, size_t num );
其中,對於memset的各個參數的定義如下:
ptr: Pointer to the block of memory to fill.
value: Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned char conversion of this value.、
num:Number of bytes to be set to the value.
在參數的說明中,提到value值是按照int類型進行的傳遞,但是在填充的時候是將value值轉換為unsigned char進行填充。因此,在使用memset進行內存初始化的時候,value值應該傳遞的是一個字節的值。
對int類型的內存區域進行初始化,ptr的類型是int*,舉例說明一下:
1. 將內存初始化為0
memset(ptr,0,sizeof(ptr));
2. 將內存初始化為-1
memset(ptr,0xff,sizeof(ptr));
因為按照字節進行填充,那麼value值為0xff,將會把內存的每個字節都填充為0xff,則int值的區域為全1,那麼int值就是-1。
3. 將內存初始化為極大值
memset(ptr,0x3f,sizeof(ptr));
這段初始化代碼初始出來的int值大小是1061109567
如果要將int內存區域統一初始化為1,那memset就無能為力了。
memset memcpy 都是 string 字符串處理函數,不是為int 型做的。
0 又 等於 NULL
所以 memset 0 沒問題。
但是 其它數字會看作是 字符,不會對應相應的 整形數字。
系統把那字符 計算成整形結果後去儲存,所以得到 奇怪的數字。
可以,例如:
//---------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
typedef struct{
int a;
int b;
} sta;
int main(void)
{
sta a[10];
memset(a,0,sizeof(sta)*10); /*將a數組中的每個元素的每個成員全部初始化為0*/
return 0;
}
//---------------------------------------------------------------------------