如果我创建了一个void指针,并将内存的一部分malloc到这个void指针,我如何打印出我刚刚分配的各个字节?例如:
void * p; p = malloc(24); printf("0x%x\n", (int *)p);
我想上面打印的24字节,我刚刚分配。
ghhaqwfi1#
size_t size = 24; void *p = malloc(size); for (int i = 0; i < size; i++) { printf("%02x", ((unsigned char *) p) [i]); }
当然,它会调用未定义的行为(由malloc分配的对象的值具有不确定的值)。
malloc
vlurs2pr2#
您不能-在初始化内容之前阅读这些字节会导致未定义的行为。但是,如果您坚持这样做,请尝试以下操作:
void *buf = malloc(24); unsigned char *ptr = buf; for (int i = 0; i < 24; i++) { printf("%02x ", (int)ptr[i]); } free(buf); printf("\n");
uz75evzq3#
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);
2ic8powd4#
void* p = malloc(24);分配24个字节,并将第一个字节的地址存储在p中。如果您尝试打印p的值,实际上将打印地址。要打印指针指向的值,需要使用*解引用它。如果可能,还应尽量避免使用void指针:
void* p = malloc(24);
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?
free
w1e3prcc5#
malloc分配的是字节而不是位,不管它是什么,你的printf试图打印内存中的地址。
printf
mdfafbf16#
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呢?
6条答案
按热度按时间ghhaqwfi1#
当然,它会调用未定义的行为(由
malloc
分配的对象的值具有不确定的值)。vlurs2pr2#
您不能-在初始化内容之前阅读这些字节会导致未定义的行为。但是,如果您坚持这样做,请尝试以下操作:
uz75evzq3#
正如H2CO3提到的,使用未初始化的数据会导致未定义的行为,但是上面的代码应该可以完成所需的操作。
2ic8powd4#
void* p = malloc(24);
分配24个字节,并将第一个字节的地址存储在p
中。如果您尝试打印p
的值,实际上将打印地址。要打印指针指向的值,需要使用*
解引用它。如果可能,还应尽量避免使用void
指针:不要忘记
free
已由malloc
分配的内存:)这个问题也可以帮助你:What does "dereferencing" a pointer mean?
w1e3prcc5#
malloc
分配的是字节而不是位,不管它是什么,你的printf
试图打印内存中的地址。mdfafbf16#
malloc分配字节。
将打印24个字节。但如果强制转换为int,则需要调整循环:
但是,如果你知道你想要一个int,为什么不直接声明它为int呢?