如果我创建一个void指针,并将一段内存malloc到该void指针,我怎样才能打印出我刚分配的各个位?
例如:
void * p;
p = malloc(24);
printf("0x%x\n", (int *)p);
我想上面打印我刚刚分配的24位。
答案 0 :(得分:4)
size_t size = 24;
void *p = malloc(size);
for (int i = 0; i < size; i++) {
printf("%02x", ((unsigned char *) p) [i]);
}
当然它会调用未定义的行为(由malloc
分配的对象的值具有不确定的值)。
答案 1 :(得分:2)
您不能 - 在初始化其内容之前读取这些字节会导致未定义的行为。但是,如果你真的坚持这样做,试试这个:
void *buf = malloc(24);
unsigned char *ptr = buf;
for (int i = 0; i < 24; i++) {
printf("%02x ", (int)ptr[i]);
}
free(buf);
printf("\n");
答案 2 :(得分:2)
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);
答案 3 :(得分:1)
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));
不要忘记free
由malloc
分配的内存:)
这个问题也可以帮到你:What does "dereferencing" a pointer mean?
答案 4 :(得分:0)
malloc
以字节分配,而不是以位分配。无论它是什么,你的printf
都试图在内存中打印一个地址。
答案 5 :(得分:0)
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?