memset не заполняет массив - PullRequest
       13

memset не заполняет массив

4 голосов
/ 14 сентября 2009
 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

пс: u32 - это простой typedef без знака int

редактирование:

  • Компиляция с gcc 4.3.4
  • string.h включен

Ответы [ 4 ]

11 голосов
/ 14 сентября 2009

Второй параметр в memset набирается как int, но на самом деле является неподписанным символом . 0xBAADF00D, преобразованный в беззнаковый символ (младший байт), равен 0x0D, поэтому memset заполняет память 0x0D.

2 голосов
/ 14 сентября 2009

Я попробовал это с 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] );
}
2 голосов
/ 14 сентября 2009

Второй аргумент memset () - это символ, а не int или u32. C автоматически усекает 0xBAADF00D int в 0x0D char и устанавливает каждый символ в памяти в соответствии с запросом.

0 голосов
/ 19 апреля 2019

Трюк с memcpy( ecx+1, ecx, ... здесь не работает в Linux. Копируется только 1 байт вместо iterations-1.

...