Domanda

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

In parole povere, perché il mio output è il seguente?

0D0D0D0D
BAADF00D

ps: u32 è un semplice refuso di unsigned int

modifica:

  • Compilazione con gcc 4.3.4
  • string.h è incluso
È stato utile?

Soluzione

Il secondo parametro per memset è digitato come int ma è davvero un carattere senza segno . 0xBAADF00D convertito in un carattere senza segno (byte meno significativo) è 0x0D, quindi memset riempie la memoria con 0x0D.

Altri suggerimenti

Il secondo argomento di memset () è un carattere, non un int o u32. C tronca automaticamente 0xBAADF00D int in un carattere 0x0D e imposta ogni carattere in memoria come richiesto.

L'ho provato con wmemset (). Sembra funzionare:


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

Il trucco con memcpy (ecx + 1, ecx, ... non funziona qui su Linux. Viene copiato solo 1 byte invece di iterations-1 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top