无效 *a = &a 如何合法?

How is void *a = &a legal?

本文关键字:无效      更新时间:2023-10-16

考虑以下C++代码:

void* a = &a;

为什么编译器不抱怨使用了未声明的标识符?

此外,编译器认为变量a是什么?它是指向void对象的指针还是指向void*指针的指针?

C++中变量声明的范围可能非常令人惊讶:

void* a =               &a;
         ^~~~~~~~~~~~~~~~~
          a declared as `void*` from here on

因此,&avoid**,但由于任何指针类型都可以隐式转换为void*。。。

它相当于

void* a;
a = &a;

因此,已声明a。所以a得到a中写入的a的地址。所以它是一个指向空指针的指针。(您还没有定义任何对象。)

void* a中,a被声明为不是指向void类型而是指向"any"类型的指针(特殊情况)。地址(存储器中的位置)被分配给a,当然,就像被声明的任何其他变量一样。

之后,表达式&a被求值以初始化刚刚声明的变量(也是a,但这并不相关)。&a的类型为"指针到任何类型的指针",这是"指针到任意类型"的特殊情况,与a的类型完全兼容。呃,没有编译器消息。

推论:如果要进行强类型检查,请不要使用void*任何都可以转换为它。相反,除了void*本身(类型与自身不兼容是不必要的例外)。

此外,AFAIR这确实来自C.