memset没有填充数组

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 

ps:u32是unsigned int的简单typedef

编辑:

  • 用gcc 4.3.4编译
  • string.h包括在内

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

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

我用wmemset()试了一下。 它似乎工作:

 #include  #include  #include  #include  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] ); }