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

ste*_*ess 1 c printf pointers 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);    

}
Run Code Online (Sandbox Code Playgroud)

我的问题涉及以下部分:

printf("Pointer p has address %p and points to %p\n", (void*)&p, (void*)p);
Run Code Online (Sandbox Code Playgroud)

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

简单地写下面的内容有什么区别?

 printf("Pointer p has address %p and points to %p\n", &p, p);
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 10

这是因为,%p 显式期望一个类型的参数void *.

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

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

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

严格来说,按照标准规定,从同一章第7段开始

[...]如果任何参数不是相应转换规范的正确类型,则行为未定义.

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

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

  • 有时你得到"幸运",UB做你期望的. (2认同)
  • @steady_progress:没有强制转换,行为是*undefined*,因为参数的类型与转换说明符所期望的不匹配 - 它可能有效,但可能不行.如果`sizeof(int*)!= sizeof(void*)`,那么你可能会出现乱码输出. (2认同)
  • @steady_progress从技术上讲,演员是必需的,正如标准中规定的那样.没有它,它会调用[未定义的行为](https://en.wikipedia.org/wiki/Undefined_behavior). (2认同)