打印无效指针的位

如果我创建一个void指针,并将一段内存malloc到该void指针,那么如何打印出我刚刚分配的各个位?

例如:

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

我想上面打印我刚刚分配的24位。

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

当然它会调用未定义的行为( malloc分配的对象的值具有不确定的值)。

您不能 – 在初始化其内容之前读取这些字节会导致未定义的行为。 但是,如果你真的坚持这样做,试试这个:

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

正如H2CO3所提到的,使用未初始化的数据会导致未定义的行为,但上面的剪辑应该做到想要的。 呼叫:

 print_memory(p, 24); 

void* p = malloc(24); 分配24个字节并将第一个字节的地址存储在p 。 如果您尝试打印p的值,您实际上将打印该地址。 要打印指针指向的值,需要使用*取消引用它。 如果可能,还要尽量避免使用void指针:

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

并且不要忘记freemalloc分配的malloc 🙂

这个问题也可以帮助你: “取消引用”指针是什么意思?

malloc以字节为单位分配,而不是以位为单位分配。 无论它是什么,你的printf都试图在内存中打印一个地址。

malloc分配字节。

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

会打印24个字节。 但如果转换为int,则需要调整循环:

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

但是,如果你知道你想要一个int,为什么不把它声明为int呢?