我阅读了以下程序代码:
#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);
答案 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
其他编制者可能不那么原谅。