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