memset没有填充数组

Dan*_*oof 4 c 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);
Run Code Online (Sandbox Code Playgroud)

非常简单地说,为什么我的输出如下?

0D0D0D0D
BAADF00D
Run Code Online (Sandbox Code Playgroud)

ps:u32是unsigned int的简单typedef

编辑:

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

Tad*_*mas 11

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

  • @Daniel,它是*愚蠢*因为该例程使用`stosb`汇编命令来非常快地设置字节,但它不支持`stosw`(word)和`stosd`(dword). (4认同)
  • 即使它真的想要一个`unsigned char`,`memset`也需要`int`的原因是它的日期是ANSI C之前的几天,当时引入了函数原型.非原型函数的参数扩展为`int` /`unsigned int`,因此为了使`memset`的原型ANSI C定义与旧的非原型定义兼容,它必须采用`int`. (4认同)