Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 26th, 2012  |  syntax: C  |  size: 2.20 KB  |  hits: 36  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6.     int b = 0;
  7.  
  8.     memset(&b, 0x0102, 3);
  9.     printf("b=0x%x\n", b);
  10.  
  11.     return 0;
  12. }
  13.  
  14. /***********************************************************
  15. 实际输出为b=0x20202,看了memset的实现,原来填充总是以第
  16. 二个参数的最低字节来填充
  17. ***********************************************************/
  18.  
  19.  
  20. #if 0
  21. /**********************************************************
  22. 这个是glibc库中memset的实现
  23. **********************************************************/
  24. void * memset (dstpp, c, len)
  25. void *dstpp;
  26. int c;
  27. size_t len;
  28. {
  29.     long int dstp = (long int) dstpp;
  30.  
  31.     if (len >= 8)
  32.     {
  33.         size_t xlen;
  34.         op_t cccc;
  35.  
  36.         cccc = (unsigned char) c;
  37.         cccc |= cccc << 8;
  38.         cccc |= cccc << 16;
  39.  
  40.         if (OPSIZ > 4)
  41.             /* Do the shift in two steps to avoid warning if long has 32 bits.  */
  42.             cccc |= (cccc << 16) << 16;
  43.         /* There are at least some bytes to set.
  44.            No need to test for LEN == 0 in this alignment loop.  */
  45.         while (dstp % OPSIZ != 0)
  46.         {
  47.             ((byte *) dstp)[0] = c;
  48.             dstp += 1;
  49.             len -= 1;
  50.         }
  51.  
  52.         /* Write 8 `op_t' per iteration until less than 8 `op_t' remain.  */
  53.         xlen = len / (OPSIZ * 8);
  54.         while (xlen > 0)
  55.         {
  56.             ((op_t *) dstp)[0] = cccc;
  57.             ((op_t *) dstp)[1] = cccc;
  58.             ((op_t *) dstp)[2] = cccc;
  59.             ((op_t *) dstp)[3] = cccc;
  60.             ((op_t *) dstp)[4] = cccc;
  61.             ((op_t *) dstp)[5] = cccc;
  62.             ((op_t *) dstp)[6] = cccc;
  63.             ((op_t *) dstp)[7] = cccc;
  64.             dstp += 8 * OPSIZ;
  65.             xlen -= 1;
  66.         }
  67.         len %= OPSIZ * 8;
  68.         /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain.  */
  69.         xlen = len / OPSIZ;
  70.         while (xlen > 0)
  71.         {
  72.             ((op_t *) dstp)[0] = cccc;
  73.             dstp += OPSIZ;
  74.             xlen -= 1;
  75.         }
  76.         len %= OPSIZ;
  77.     }
  78.     /* Write the last few bytes.  */
  79.     while (len > 0)
  80.     {
  81.         ((byte *) dstp)[0] = c;
  82.         dstp += 1;
  83.         len -= 1;
  84.     }
  85. }
  86. #endif