Domanda

Sto provando a stampare il valore puntato da un indirizzo, ma il problema è che ho bisogno di dereference questo puntatore sulla base delle dimensioni che viene passato a me. Quindi qualcosa di questo genere:

void print(Address addr, Int size) {
...
}

Sono un po 'confuso su come raggiungere questo obiettivo. Qualcuno può punto me nella giusta direzione?

EDIT: Ok così sto pensando:

char p[80];
memset(p, '\0', 80);
memcpy(p, addr, size);

E poi dereferenzia come * p. Se c'è un modo migliore o un modo corretto, per favore fatemelo sapere

È stato utile?

Soluzione

La tua domanda è molto chiara. Se vuoi dire che si desidera scaricare i dati binari arbitrari dall'indirizzo passato, si desidera qualcosa di simile:

void print(const unsigned char *addr, size_t size)
{
    while (size--) printf("%.2x", *addr++);
}

Se vuoi dire che si desidera stampare i dati di carattere che non è terminazione null, provare:

void print(const char *addr, int size)
{
    printf("%.*s", size, addr);
}

Altri suggerimenti

Se si tratta di un numero, che presumo sia, avrete bisogno di qualcosa di simile a questo:

int n=0;
if (size>sizeof(int)) { return; //int is too small };
for (int i=0;i<size;i++) {
  ((char*)(&n))[sizeof(int)-(i+1)] = ((char*)addr)[size-(i+1)];
}
printf("%d",n);

È possibile utilizzare un'istruzione switch nella routine:

switch (size) {
   case 1: print( *(char*)pointer); break;
   case 2: print( *(short*)pointer); break;
   case 4: print( *(long *)pointer); break;
   case 8: print( *(__int64*)pointer); break;
   default: puts( "unsupported);
}

( "print" è una routine per stampare interi di varie dimensioni, magari utilizzando C ++ polimorfismo)

Una soluzione sofisticata è quella di utilizzare un template C ++ per esempio utilizzando un tipo di parametro che viene Integer succedanei dal tipo di variabile reale in base alla chiamata. Questa routine può quindi agire sulla dimensione di questa variabile Integer (che può variare da 1 a 8, o più se si implementa più lunghi interi da soli). Questo svantaggio di questo approccio è che il compilatore genera un'istanza routine per ogni tipo di argomento, e la logica dipende dalle dimensioni provocano stati "sempre true" per alcuni test. Un facile via d'uscita è quello di utilizzare sempre il tipo più lunga di numero intero che ci si aspetta.

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