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()在使用返回的指针之前,应始终检查是否成功.| 归档时间: |
|
| 查看次数: |
390 次 |
| 最近记录: |