4
 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
4

4 回答 4

11

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

于 2009-09-13T21:20:09.357 回答
2

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

于 2009-09-13T21:20:29.213 回答
2

我用 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] );
}
于 2009-09-13T22:15:40.237 回答
0

这个技巧memcpy( ecx+1, ecx, ...在 Linux 上不起作用。仅复制 1 个字节而不是iterations-1.

于 2019-04-19T13:43:16.023 回答