繁体   English   中英

没有类型转换的空指针

[英]Void pointer without type casting

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

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

void 指针如何在不进行类型转换的情况下确定数据类型?

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

严格来说,由于两个问题,您的程序会出现未定义的行为:

  1. 您正在使用未初始化的变量。
  2. 您正在使用一个指针,其中在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM