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);    
}
我的问题涉及以下部分:
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);
Sou*_*osh 10
这是因为,%p 显式期望一个类型的参数void *.
引用C11,章节§7.21.6.1,fprintf()
p参数应该是指针void.[....]
由于printf()是一个可变参数函数,并且指针没有默认参数提升,因此需要强制转换.
严格来说,按照标准规定,从同一章第7段开始
[...]如果任何参数不是相应转换规范的正确类型,则行为未定义.
也就是说,为了使答案完整,
p = malloc(sizeof(int));可以重写,p= malloc(sizeof*p);以使其更健壮.malloc()在使用返回的指针之前,应始终检查是否成功.