2

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

例如:

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

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

4

6 回答 6

5
size_t size = 24;
void *p = malloc(size);

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

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

于 2013-02-01T22:51:25.893 回答
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");
于 2013-02-01T22:52:56.973 回答
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);
于 2013-02-01T22:53:14.860 回答
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:)

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

于 2013-02-01T22:55:59.413 回答
0

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

于 2013-02-01T22:51:02.423 回答
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 呢?

于 2013-02-01T22:52:27.173 回答