[英]Casting function pointer to void(*)(), then recasting to original type
[英]Void pointer without type casting
int main
{
void* i;
printf("%d",i);
return 0;
}
输出:(垃圾值)void 指针如何在不进行类型转换的情况下确定数据类型?
void 指针如何在不进行类型转换的情况下确定数据类型?
未初始化的指针值被转换为int
并打印int
。
严格来说,由于两个问题,您的程序会出现未定义的行为:
printf
中需要一个int
。编译器通常不会关心传递给函数printf
的参数类型是什么。
函数声明如下
int printf(const char * restrict format, ...);
如您所见,只有第一个参数明确指定了类型。 在一般情况下,编译器无法检查其他参数是否有效。
当函数执行时,它解析它的第一个参数搜索格式指定,并根据这些格式说明符尝试解释以下参数。
在您的示例中,格式字符串具有格式说明符%d
printf("%d",i);
因此该函数将 i 的值解释为int
类型。 考虑到(C 标准)
如果任何参数不是相应转换规范的正确类型,则行为是 undefined 。
除此之外,您甚至没有初始化变量i
。
示例中打印了垃圾,因为i
是一个指针,而printf
只会打印其内容; 即, i
持有的地址。 如果您想打印i
指向的整数,请使用printf("%d", *i)
,但这将失败,因为您无法取消引用 void 指针。 它不会编译。 在取消引用之前进行强制转换是必要的。
关于 void 指针如何确定值类型:它没有。 它只是指向它。 如果您想在其他地方使用该值,您必须告诉它所指向的数据类型。
int main(){
int i = 10;
void *ptr = &i;
/* Cast to a int pointer and then dereference. */
printf("%d", *((int*)ptr));
return 0;
}
打印指针时,请使用%p
格式。
printf("%d",i);
接受任何i
,将其转换为int
,然后打印出来。
这是垃圾,因为你没有正确初始化你的i
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.