程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> memset函數語法 用法 例子

memset函數語法 用法 例子

編輯:關於C語言
 

該例子說明幾個問題

    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,如果有,就默認字符結束,不會輸出後面的亂碼)
  測試環境vc6.0 ********************************************************************/

#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;}
/********************************************************************* 0 0 0 0 0 0 0 0 0 0 Press any key to continue
 
  1 1 1 1 1 1 1 1 1 1 Press any key to continue
 
  0X1010101 0X1010101 0X1010101 0X1010101 0X1010101 Press any key to continue
 
  -1 -1 -1 -1 -1 -1 -1 -1 -1 Press any key to continue *********************************************************************/
 
  /********************************************************************* 例1:      char str[9];      用memset給str初始化為{0 0 0 0 0 0 0 0},用法如下      memset(str,0,8);      輸出:           0 0 0 0 0 0 0 0 -52(任意的)
  例2:      int num[8];      用memset給num初始化為{1,1,1,1,1,1,1,1},用法如下      memset(num, 1, 8);  // error              一個int是4個字節的,8個int是32個字節,所以首先要賦值的長度就不應該為8而是32。      因為memset是 逐字節 拷貝,以num為首地址的8字節空間都被賦值為1,      即一個int變為0X00000001 00000001 00000001 00000001,顯然,把這個數化為十進制不會等於1的。
       所以,在memset使用時要千萬小心,在給char以外的數組賦值時,只能初始化為0或者-1。      因為在計算機裡,0的二進制都是0,-1的二進制都是1。  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved