在整数指针前面写(void *)的重点是什么?

时间:2016-12-12 16:48:06

标签: c pointers printf void-pointers format-specifiers

我阅读了以下程序代码:

#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);

2 个答案:

答案 0 :(得分:10)

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

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

  

p参数应该是指向void的指针。 [....]

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

严格地说,按照标准规定,同一章第7段

  

[...]如果有任何论据   不是相应转换规范的正确类型,行为是   未定义。

那就是说,要完成答案,

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

答案 1 :(得分:1)

  

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

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

Pointer p has address 0x7fff501357d8 and points to 0x7fcb38c00390

其他编制者可能不那么原谅。