memset没有填充数组

时间:2009-09-13 21:16:27

标签: 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);

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

0D0D0D0D
BAADF00D

PS: u32是unsigned int的简单typedef

编辑:

  • 使用gcc 4.3.4进行编译
  • 包含string.h

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:2)

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

答案 2 :(得分: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] );
}

答案 3 :(得分:0)

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