Pregunta

 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);

En pocas palabras, ¿por qué mi salida es la siguiente?

0D0D0D0D
BAADF00D

ps: u32 es un simple typedef de unsigned int

editar:

  • Compilando con gcc 4.3.4
  • string.h está incluido
¿Fue útil?

Solución

El segundo parámetro para memset se escribe como int pero es realmente un carácter sin firmar . 0xBAADF00D convertido a un carácter sin signo (byte menos significativo) es 0x0D, por lo que memset llena la memoria con 0x0D.

Otros consejos

El segundo argumento para memset () es un char, no un int o u32. C trunca automáticamente el 0xBAADF00D int en un carácter 0x0D y establece cada carácter en la memoria según lo solicitado.

Lo probé con wmemset (). Parece funcionar:


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

El truco con memcpy (ecx + 1, ecx, ... no funciona aquí en Linux. Solo se copia 1 byte en lugar de iterations-1 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top