为什么这个双变量会导致细分错误?

时间:2019-09-11 22:07:32

标签: c++ segmentation-fault

我正在研究一些代码以了解指针的工作方式。我将非指针变量设置为double,这导致了分段错误。我不知道为什么会这样,因为变量没有与程序中的其他任何东西交互。

#include <iostream>

int main() {

    int firstValue;
    double secondValue = 54.6;

    int *p1;
    *p1 = firstValue;
    p1 = &firstValue;
    *p1 = 10;
    std::cout << "&firstvalue is " << &firstValue << '\n';

    std::cout << "firstvalue is " << firstValue << '\n';

    std::cout << "p1 is " << p1 << '\n';

    std::cout << "*p1 is " << *p1 << '\n';
}

已存在细分错误;

1 个答案:

答案 0 :(得分:0)

  

我不知道为什么会这样,因为变量没有与程序中的其他任何东西交互。

这是未定义行为的标志。该变量不与其他任何东西直接交互,但是存在于程序中。这足以改变编译器处理未定义行为的方式,有可能将无提示无操作变成崩溃。

[在您的情况下,在为变量分配值之前使用变量的值时,会出现不确定的行为。具体来说,int *p1;声明了一个变量,但未为其分配值,而下一行中的“ *p1”使用了p1的值(将地址移至{ {1}}被复制。同样,此时尚未为firstValue分配任何值,因此您在同一分配中还会得到另一未定义的行为。实际上,实际上,是导致片段错误的未初始化指针。]

依靠诸如声明新变量来揭示未定义行为的方法不是一个好计划。更好的计划是打开所有编译器警告。这些警告可能会遗漏某些行为未定义的实例,但它们会抓住其中的很大一部分。严重的项目通常需要检查所有(或至少firstValue)个警告;无法编译无警告的代码会很快被拒绝。因此,您不妨立即学习编写无警告的代码。