我有
void *ptr = malloc(9);
printf("%X", ptr); //this shows the value of memory pointed to by ptr
//I want to try to see what ever is at the memory location by dereferenced ptr
printf("%c", (*ptr)); // try to dereference the pointer
然而这会导致编译错误...我怎么能看到指向ptr中分配的内存的值,我知道它会是一些垃圾值,我只是想看看
答案 0 :(得分:3)
void *ptr = malloc(9);
printf("%X", ptr); //this shows the value of memory pointed to by ptr
上一行应该是:
printf("%p", ptr); //this shows the value of ptr
"%X"
用于int
,使用它作为指针调用UB,意味着任何事情都可能发生。
//I want to try to see what ever is at the memory location by dereferenced ptr
printf("%c", (*ptr)); // try to dereference the pointer
由于void
是不完整的类型,因此无法取消引用。首先转换为所需类型的指针,然后我们可以说话。对于char
,该行将是:
printf("%c", *(char*)ptr); // try to dereference the pointer
但是如果你在分配之前尝试使用一个值,请注意陷阱表示和其他有趣的东西。
为您提供更多提示:
"-Wall -Wextra -pedantic"
答案 1 :(得分:1)
它无法取消引用,因为您已将其声明为void
且void
没有大小。但是,如果将它转换为具有大小的东西,则可以取消引用它。例如,printf("%c", *(char *)ptr);
答案 2 :(得分:0)
你可以这样做printf("%c\n", *((char*)ptr));
答案 3 :(得分:0)
编译器现在知道在解除引用ptr时要查找哪种数据。您可以对char *进行类型转换。 printf("%c", *((char*)ptr));
答案 4 :(得分:0)
正如其他人所说,你可以在实践中做到这一点,但它是未定义的行为:
对于C,例如在ISO / IEC 9899:TC3,WG14 / N1256中 附件J.2.1
The behavior is undefined in the following circumstances:
...
The value of the object allocated by the malloc function is used (7.20.3.3).
...