Void指针没有类型转换

时间:2015-10-27 14:46:38

标签: c++ c function pointers casting

int main
{
void* i;
printf("%d",i);
return 0;
}

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

5 个答案:

答案 0 :(得分:6)

  

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

未初始化的指针值会转换为int并打印int

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

  1. 您使用的是未初始化的变量。
  2. 您正在使用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,因此这是垃圾。