C 打印空指针的位

C 打印空指针的位,c,void-pointers,bits,C,Void Pointers,Bits,如果我创建一个空指针,并将一段内存malloc到该空指针,我如何打印出我刚才分配的各个位 例如: void * p; p = malloc(24); printf("0x%x\n", (int *)p); 我想上面打印我刚才分配的24位 malloc以字节而不是位分配。不管是什么,您的printf正在尝试在内存中打印地址 size\u t size=24; size_t size = 24; void *p = malloc(size); for (int i = 0; i < siz

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

例如:

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

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

malloc以字节而不是位分配。不管是什么,您的
printf
正在尝试在内存中打印地址

size\u t size=24;
size_t size = 24;
void *p = malloc(size);

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

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

malloc分配字节

 for (i = 0; i < 24; ++i) printf("%02xh ", p[i]);
(i=0;i<24;++i)printf(“%02xh”,p[i]);
将打印24个字节。但如果强制转换为int,则需要调整循环:

 for (i = 0; i < 24; i += sizeof(int)) printf("%xh", *(int *)&p[i]);
(i=0;i<24;i+=sizeof(int))printf(“%xh”,*(int*)&p[i]); 但是,如果你知道你想要一个int,为什么不把它声明为int呢?

你不能-在初始化它们的内容之前读取这些字节会导致未定义的行为。但是,如果您确实坚持这样做,请尝试以下方法:

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*buf=malloc(24);
无符号字符*ptr=buf;
对于(int i=0;i<24;i++){
printf(“%02x”,(int)ptr[i]);
}
免费(buf);
printf(“\n”);
正如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));
无符号字符*p=malloc(24);
//将某些内容存储到p指向的内存中。。。
对于(int i=0;i<24;++i)
printf(“%02X”,*(p+i));
不要忘了
释放
malloc分配的内存(
malloc
:)


这个问题也可以帮助您:

实际上您分配了24个字节。(严格地说,您分配了容纳24个字符的空间。)+1,但也许您可以省略对未定义行为的注释。这已经隐含在问题中了。OP想知道在
malloc
@s.bandara之后内存是什么样子的。为什么它是隐式的?OP似乎根本不知道它。@s.bandara我需要它,否则有人会否决这个答案,因为它调用了未定义的行为;)这就是我想的,它看起来像一个CYA句子,我想它应该消失@H2CO3,如果目标是检查
malloc
分配的内存,那么从这个意义上讲,它甚至不是未定义的行为。相反,结果是不确定的,但是
scanf
的行为也是不确定的,例如。@MichaelBurr严格地说,读取不确定值总是UB(因此,即使您读取
无符号字符
对象,并且我们知道
无符号字符
对象没有陷阱表示)。请参见DR#338 http://不加i,它永远不会返回。我承认不,我不懂指针算术。我需要使用一个空指针,因为有一个更大的赋值的规范。@kubiej21我把这个指针指向了这个答案的作者。好吧,那么一个打字错误会得到一个刻薄的注释吗?你确定你了解与人类的互动吗?
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));