該例子說明幾個問題
1. memset函數 原型:void * memset(void *a, int val, unsigned int length); 功能:把從a開始的length個字節都設置為值val。 作用:在一段內存塊中填充某個給定的值,它對較大的結構體或數組進行清零操作的一種最快方法。 頭文件: #include <string.h> 注意: memset是逐字節賦值的。 2. 常見的三種錯誤 (1) 搞反了val和length的位置。 一定要記住:如果要把一個char a[20]清零, 一定是 memset(a, 0, 20), 而不是 memset(a, 20, 0) (2) 過度使用memset, 我想這些程序員可能有某種心理陰影, 他們懼怕未經初始化的內存, 所以他們會寫出這樣的代碼: char buffer[20]; memset(buffer, 0, sizeof(char) * 20); strcpy(buffer, "123"); 這裡的memset是多余的. 因為這塊內存馬上就被覆蓋了, 清零沒有意義. (3) 其實這個錯誤嚴格來講不能算用錯memset, 但是它經常在使用memset的場合出現 int some_func(struct something *a) { ... memset(a, 0, sizeof(a)); ... } 問: 為何要用memset置零? memset( &Address, 0, sizeof(Address)); 經常看到這樣的用法,其實不用的話,分配數據的時候,剩余的空間也會置零的。 答: 1. 如果不清空,可能會在測試當中出現野值。 你做下面的試驗看看結果() char buf[5]; CString str, str1; //memset(buf, 0, sizeof(buf)); for(int i = 0; i<5; i++) { str.Format(“%d “, buf[i]); str1 += str; } TRACE(“%s\r\n“, str1) 2. 其實不然!特別是對於字符指針類型的,剩余的部分通常是不會為0的,不妨作一個試驗, 定義一個字符數組,並輸入一串字符,如果不用memset實現清零,使用MessageBox顯示出 來就會有亂碼(0表示NULL,如果有,就默認字符結束,不會輸出後面的亂碼)/********************************************************************* 0 0 0 0 0 0 0 0 0 0 Press any key to continue#include <stdio.h>
#include <string.h>
int main(void){/* // char類型數組 int i; char a[10]; memset(a, 0, 10); for (i = 0; i < 10; i++) printf("%d ", a[i]);
printf("\n");*/
/* // char類型數組中所有元素都設置成1 int i; char a[10];
memset(a, 1, 10);
for (i = 0; i < 10; i++) printf("%d ", a[i]);
printf("\n");*/
/* // int類型數組中所有元素都設置成1,卻是不可行的 int i; int a[5];
memset(a, 1, 5 * sizeof(int));
for (i = 0; i < 5; i++) printf("%#X ", a[i]);
printf("\n");*/
// 使用memset在給char以外的數組賦值時,只能初始化為0或者-1。 char i; int a[10];
memset(a, -1, 10 * sizeof(int));
for (i = 0; i < 9; i++) printf("%d ", a[i]);
printf("\n");
return 0;}