在整数指针前面写 (void*) 有什么意义?
What's the point of writing (void*) in front of integer pointer?
我阅读了以下程序代码:
#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);
这是因为,%p
明确地 需要类型为 void *
的参数。
引用 C11
,章节 §7.21.6.1,fprintf()
p
The argument shall be a pointer to void
. [....]
由于 printf()
是可变参数函数并且没有指针的默认参数提升,因此需要强制转换。
严格来说,根据标准授权,同一章第 7 段
[...] If any argument is
not the correct type for the corresponding conversion specification, the behavior is
undefined.
也就是说,为了使答案完整,
p = malloc(sizeof(int));
可以重写为 p= malloc(sizeof*p);
以使其更健壮。
- 在使用返回的指针之前,您应该始终检查
malloc()
是否成功。
I don't understand what the (void*) is doing. Is this a cast? What's the point of doing this?
是的,这是演员表。我的编译器 (llvm) 似乎没有必要,即使我删除了强制转换,它也会提供以下输出:
Pointer p has address 0x7fff501357d8 and points to 0x7fcb38c00390
其他编译器可能不会这么宽容。
我阅读了以下程序代码:
#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);
这是因为,%p
明确地 需要类型为 void *
的参数。
引用 C11
,章节 §7.21.6.1,fprintf()
p
The argument shall be a pointer tovoid
. [....]
由于 printf()
是可变参数函数并且没有指针的默认参数提升,因此需要强制转换。
严格来说,根据标准授权,同一章第 7 段
[...] If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.
也就是说,为了使答案完整,
p = malloc(sizeof(int));
可以重写为p= malloc(sizeof*p);
以使其更健壮。- 在使用返回的指针之前,您应该始终检查
malloc()
是否成功。
I don't understand what the (void*) is doing. Is this a cast? What's the point of doing this?
是的,这是演员表。我的编译器 (llvm) 似乎没有必要,即使我删除了强制转换,它也会提供以下输出:
Pointer p has address 0x7fff501357d8 and points to 0x7fcb38c00390
其他编译器可能不会这么宽容。