代码之家  ›  专栏  ›  技术社区  ›  Daniel Sloof

memset未填充数组

  •  4
  • Daniel Sloof  · 技术社区  · 17 年前
     u32 iterations = 5;
     u32* ecx = (u32*)malloc(sizeof(u32) * iterations);
    
     memset(ecx, 0xBAADF00D, sizeof(u32) * iterations);
     printf("%.8X\n", ecx[0]);
    
     ecx[0] = 0xBAADF00D;
     printf("%.8X\n", ecx[0]);
    
     free(ecx);
    

    0D0D0D0D
    BAADF00D
    

    • 用gcc 4.3.4编译
    4 回复  |  直到 17 年前
        1
  •  11
  •   Tadmas    17 年前

    memset的第二个参数类型为int,但 really an unsigned char 转换为无符号字符(最低有效字节)的.0xBAADF00D为0x0D,因此memset用0x0D填充内存。

        2
  •  2
  •   George Phillips    17 年前

    memset()的第二个参数是char,而不是int或u32。C会自动将0xBAADF00D int截断为0x0D char,并根据请求在内存中设置每个字符。

        3
  •  2
  •   sambowry    17 年前

    我用wmemset()尝试过。它似乎奏效了:

    
    #include <stdlib.h>
    #include <stdio.h>
    #include <inttypes.h>
    #include <wchar.h>
    
    int main(void){
      uint32_t iterations = 5;
      uint32_t *ecx = (uint32_t*)malloc(sizeof(uint32_t) * iterations);
    
      wmemset( (wchar_t*)ecx, 0xBAADF00D, sizeof(uint32_t) * iterations);
      printf("%.8X\n", ecx[0]);
    
      ecx[0] = 0xBAADF00D;
      printf("%.8X\n", ecx[0]);
    
      /* Update: filling the array with memcpy() */
      ecx[0] = 0x11223344;
      memcpy( ecx+1, ecx, sizeof(*ecx) * (iterations-1) );
      printf("memcpy:   %.8X %.8X %.8X %.8X %.8X\n",
                 ecx[0], ecx[1], ecx[2], ecx[3], ecx[4] );
    }