C++ 在c/cpp中执行int*p=p时会发生什么?

C++ 在c/cpp中执行int*p=p时会发生什么?,c++,pointers,C++,Pointers,下面的代码正在MinGw中编译。它是如何编译的?如何分配尚未创建的变量 int main() { int*p=p; return 0; } 它是如何编译的 变量的声明点从其声明符的末尾开始,但在其初始值设定项之前。这允许更合法的自引用声明,如 void * p = &p; 以及像您这样未定义的初始化 如何分配尚未创建的变量 int main() { int*p=p; return 0; } 这里没有任务,只是初始化 变量已创建(即已为其分配存储)

下面的代码正在MinGw中编译。它是如何编译的?如何分配尚未创建的变量

 int main()
{
    int*p=p;
    return 0;
}
它是如何编译的

变量的声明点从其声明符的末尾开始,但在其初始值设定项之前。这允许更合法的自引用声明,如

void * p = &p;
以及像您这样未定义的初始化

如何分配尚未创建的变量

 int main()
{
    int*p=p;
    return 0;
}
这里没有任务,只是初始化

变量已创建(即已为其分配存储),但未初始化。您可以使用未定义的行为,从该存储中碰巧存在的任何不确定值初始化它


如果您要求,大多数编译器会在使用未初始化值时发出警告或错误。

让我们看看
int*p=p语句:

  • 编译器在堆栈上分配空间来保存尚未初始化的变量p的值
  • 然后编译器用未初始化的值初始化p
  • 因此,基本上,代码应该没有问题,只是它为变量指定了一个未初始化的值

    实际上,与以下代码没有太大区别:

    int *q;        // define a pointer and do not initialize it
    int *p = q;    // assign the value of the uninitizlized pointer to another pointer
    
    可能的结果(“它编译为什么”)将是一个指针变量的声明,该变量根本没有初始化(由于没有使用它,因此随后会进行优化,因此最终结果将是“空的main”)

    指针被声明并初始化。到目前为止,这是一件普通而合法的事情。但是,它被初始化为自身,其值仅在语句结束后(即分号位置)处于有效的初始化状态。
    不出所料,这使得该声明没有定义行为

    根据定义,调用未定义的行为原则上可能会导致几乎所有的事情(尽管经常引用的戏剧性效果,如格式化硬盘驱动器或启动计算机被夸大了)

    编译器实际上可能会生成一条指令,将寄存器(或内存位置)移动到自身,这在大多数体系结构上是一条无操作指令,但在某些具有特殊指针验证寄存器的异域体系结构上可能会导致硬件异常终止进程(在“随机”情况下)值通常是无效地址)。
    但是,编译器不会插入任何“格式化硬盘”语句

    在实践中,优化编译器在遇到未定义的行为时通常会假定“没有发生”,因此编译器很可能只是遵守声明,而不做任何其他事情。

    这在任何意义上都是完全允许的,因为没有定义的行为。此外,对于编译器来说,这是最简单、最省事的选项。

    主要与
    p
    的作用域包括其初始值设定项有关。啊,是的,你是对的。我的错误。它是被创建的,只是没有初始化。所以,这是未定义的行为。它可以编译。它可能无法编译。它可能会使你的房子着火。