imprimer des bits d’un pointeur vide

Si je crée un pointeur vide et que je mets une section de mémoire sur ce pointeur vide, comment puis-je imprimer les bits individuels que je viens d’allouer?

Par exemple:

void * p; p = malloc(24); printf("0x%x\n", (int *)p); 

Je voudrais que ce qui précède imprime les 24 bits que je viens d’allouer.

 size_t size = 24; void *p = malloc(size); for (int i = 0; i < size; i++) { printf("%02x", ((unsigned char *) p) [i]); } 

Bien sûr, il invoque un comportement indéfini (la valeur d'un object atsortingbué par malloc a une valeur indéterminée).

Vous ne pouvez pas – lire ces octets avant d’initialiser leur contenu conduit à un comportement indéfini. Cependant, si vous insistez vraiment pour cela, essayez ceci:

 void *buf = malloc(24); unsigned char *ptr = buf; for (int i = 0; i < 24; i++) { printf("%02x ", (int)ptr[i]); } free(buf); printf("\n"); 
 void print_memory(void *ptr, int size) { // Print 'size' bytes starting from 'ptr' unsigned char *c = (unsigned char *)ptr; int i = 0; while(i != size) printf("%02x ", c[i++]); } 

Comme H2CO3 l’a mentionné, l’utilisation de données non initialisées entraîne un comportement indéfini, mais la capture ci-dessus doit faire ce que vous voulez. Appel:

 print_memory(p, 24); 

void* p = malloc(24); alloue 24 octets et stocke l’adresse du premier octet dans p . Si vous essayez d’imprimer la valeur de p , vous allez réellement imprimer l’adresse. Pour imprimer la valeur indiquée par votre pointeur, vous devez la déréférencer à l’aide de * . Essayez également d’éviter les pointeurs void si possible:

 unsigned char *p = malloc(24); // store something to the memory where p points to... for(int i = 0; i < 24; ++i) printf("%02X", *(p + i)); 

Et n'oubliez pas de free la mémoire allouée par malloc 🙂

Cette question pourrait également vous aider: que signifie "déréférencer" un pointeur?

malloc alloue en octets et non en bits. Et quoi qu’il en soit, votre printf essaie d’imprimer une adresse dans la mémoire.

Le malloc alloue des octets.

  for (i = 0; i < 24; ++i) printf("%02xh ", p[i]); 

serait imprimer les 24 octets. Mais si vous transtypez un int, vous devrez ajuster la boucle:

  for (i = 0; i < 24; i += sizeof(int)) printf("%xh", *(int *)&p[i]); 

Mais alors, si vous savez que vous voulez un int, pourquoi ne pas simplement le déclarer comme un int?