在整数指针前面写 (void*) 有什么意义?

What's the point of writing (void*) in front of integer pointer?

我阅读了以下程序代码:

#include <stdio.h> 
#include <stdlib.h>


int main () {
    int *p;
    p= malloc(sizeof(int)); 
    *p=42; 

    printf("Pointer p has address %p and points to %p\n",
    (void*)&p, (void*)p);

   free(p);    

}

我的问题涉及以下部分:

printf("Pointer p has address %p and points to %p\n", (void*)&p, (void*)p);

我不明白 (void*) 在做什么。这是演员表吗?这样做有什么意义?

上面的和简单写下面有什么区别?

 printf("Pointer p has address %p and points to %p\n", &p, p);

这是因为,%p 明确地 需要类型为 void * 的参数。

引用 C11,章节 §7.21.6.1,fprintf()

p The argument shall be a pointer to void. [....]

由于 printf() 是可变参数函数并且没有指针的默认参数提升,因此需要强制转换。

严格来说,根据标准授权,同一章第 7 段

[...] If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

也就是说,为了使答案完整,

  • p = malloc(sizeof(int)); 可以重写为 p= malloc(sizeof*p); 以使其更健壮。
  • 在使用返回的指针之前,您应该始终检查 malloc() 是否成功。

I don't understand what the (void*) is doing. Is this a cast? What's the point of doing this?

是的,这是演员表。我的编译器 (llvm) 似乎没有必要,即使我删除了强制转换,它也会提供以下输出:

Pointer p has address 0x7fff501357d8 and points to 0x7fcb38c00390

其他编译器可能不会这么宽容。