int main
{
void* i;
printf("%d",i);
return 0;
}
输出:(垃圾值) void指针如何在没有类型转换的情况下确定数据类型?
答案 0 :(得分:6)
void指针如何确定没有类型转换的数据类型?
未初始化的指针值会转换为int
并打印int
。
严格地说,由于两个问题,您的程序会受到不确定的行为:
int
预计printf
的指针。答案 1 :(得分:5)
编译器通常不会打扰传递给函数printf
的参数类型。
该功能按以下方式声明
int printf(const char * restrict format, ...);
如您所见,只有第一个参数具有明确指定的类型。一般情况下,编译器无法检查其他参数是否有效。
执行该函数时,它解析其第一个参数搜索格式指定,并根据这些格式说明符尝试解释以下参数。
在您的示例中,格式字符串具有格式说明符%d
printf("%d",i);
因此该函数将i的值解释为类型int
。考虑到(C标准)
如果任何参数不是相应的正确类型 转换规范,行为未定义。
除此之外,您甚至没有初始化变量i
。
答案 2 :(得分:1)
在示例中打印垃圾,因为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;
}
答案 3 :(得分:0)
打印指针时,请使用%p
格式。
答案 4 :(得分:0)
printf("%d",i);
取任何i
,将其转换为int
,并打印出来。
由于您未正确初始化i
,因此这是垃圾。