Void指针没有类型转换

Var*_*roo 0 c c++ pointers casting function

int main
{
void* i;
printf("%d",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:(垃圾值)void指针如何确定没有类型转换的数据类型?

R S*_*ahu 6

void指针如何在没有类型转换的情况下确定数据类型?

未初始化的指针值被强制转换为a intint打印出来.

严格地说,由于两个问题,您的程序会受到不确定的行为的影响:

  1. 您正在使用未初始化的变量.
  2. 您正在使用其中的一个指针int的预期printf.


Vla*_*cow 5

编译器通常不会打扰传递给函数的参数类型printf.

该函数按以下方式声明

int printf(const char * restrict format, ...);
Run Code Online (Sandbox Code Playgroud)

如您所见,只有第一个参数具有明确指定的类型.一般情况下,编译器无法检查其他参数是否有效.

当函数执行时,它解析其第一个参数搜索格式指定,并根据这些格式说明符尝试解释以下参数.

在您的示例中,格式字符串具有格式说明符 %d

printf("%d",i);
Run Code Online (Sandbox Code Playgroud)

因此该函数将i的值解释为类型int.考虑到(C标准)

如果任何参数不是相应转换规范的正确类型,则行为未定义.

除此之外,你甚至没有初始化变量i.