可以取消引用这个指针?

时间:2014-04-01 00:37:04

标签: c++ c pointers malloc

我有

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中分配的内存的值,我知道它会是一些垃圾值,我只是想看看

5 个答案:

答案 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"
  • 决定C或C ++。这个例子对两者都有效。
  • 获得标准,或至少是最后一份工作草案。维基百科指出了它们。
  • 如果您在此处发布问题,请尝试包含一个简短的示例,该示例可以立即编译。不管怎样,这一次很好。

答案 1 :(得分:1)

它无法取消引用,因为您已将其声明为voidvoid没有大小。但是,如果将它转换为具有大小的东西,则可以取消引用它。例如,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).
...