C++ 为什么这个双变量会导致分段错误?

C++ 为什么这个双变量会导致分段错误?,c++,segmentation-fault,C++,Segmentation Fault,我正在玩一些代码来理解指针是如何工作的。我将一个非指针变量设置为double,它导致了一个分段错误。我不知道为什么会发生这种情况,因为变量没有与程序中的任何其他内容交互 #include <iostream> int main() { int firstValue; double secondValue = 54.6; int *p1; *p1 = firstValue; p1 = &firstValue; *p1 = 1

我正在玩一些代码来理解指针是如何工作的。我将一个非指针变量设置为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';
}
退出,分段故障

我不知道为什么会发生这种情况,因为变量没有与程序中的任何其他内容交互

#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';
}
这是未定义行为的迹象。该变量不直接与任何其他变量交互,但它存在于程序中。这足以改变编译器处理未定义行为的方式,可能会将静默不操作变为崩溃

[在您的情况下,在为变量赋值之前使用变量的值时,存在未定义的行为。具体而言,int*p1;声明变量而不为其赋值,下一行中的*p1使用p1的值获取firstValue的值复制到的地址。类似地,没有赋值在该点上设置为firstValue,因此在同一赋值中会出现另一个未定义的行为。但实际上,是未初始化的指针导致了分段错误。]


依靠诸如声明新变量之类的方法来揭示未定义的行为并不是一个很好的计划。更好的计划是打开编译器的所有警告。这些警告可能会错过一些未定义行为的实例,但它们会捕获其中很大一部分。严重的项目通常需要全部或至少-Wall警告选中;不编译无警告的代码会很快被拒绝。因此您最好现在就学习编写无警告代码。

*p1=firstValue;导致分段错误*p1=firstValue;要工作,p1必须指向一些现有的int。添加该double可能会暴露带有seg错误的错误,但不会导致该错误。这是一个很好的例子在未定义的行为中打开。由于*p1=firstValue;的行为未定义为写入无效指针,因此程序可以执行任何操作,包括看起来它正常工作。但通常只需要一个小的扰动,在这种情况下添加一个未使用的变量,就可以使程序明显失败。*p1=firstValue;SEGB因为p1没有指向任何分配的内存。打开编译器警告。我想我明白了。当我查找分段错误的定义时,它说这是一个错误,表示软件试图访问内存的限制区域。因此,由于指针变量未定义,它在内存中没有位置,导致这可能是正确的想法,但至少术语是错误的。指针没有内存;它指向内存。一个写着Library并有一个箭头指向左边的路标并不拥有这个库;它指向它。此外,问题不是没有定义,而是没有初始化。line int*p1;在不初始化指针的情况下定义指针。指针的值为随机值或零,成为有效且不受限制的地址的可能性很小。