【问题标题】:Why is this code giving me a segmentation fault为什么这段代码给我一个分段错误
【发布时间】:2021-06-02 19:52:36
【问题描述】:

使用 MINGW 编译器在 Visual Studio 代码上运行此代码,它给了我一个分段错误

 #include <iostream>
    using namespace std;
    int main()
    {
        int *b;
        *b = 20;
    }

【问题讨论】:

  • 要取消引用指针 (*b),指针必须指向有效对象。目前b是未初始化的,所以b指向的是未定义的。
  • 请解释为什么你认为它不会,这样我们就不必猜测你误解了指针的哪一部分,这样你就不必寻找解释的相关部分.

标签: c++ mingw


【解决方案1】:

您的代码有未定义的行为b 未初始化,它没有指向任何有意义的地方。因此,取消引用 b 将导致随机内存地址,并且写入该内存会导致程序崩溃(但这不能保证,您可能只是损坏了内存)。

你需要让b指向一个有效的int,例如:

int main()
{
    int i;
    int *b = &i;
    *b = 20; // writes to i
}

【讨论】:

    【解决方案2】:

    您的第一个 Line 定义器是一个指向 int 的指针,无需设置它指向的位置,因此它可以指向任何地方。

    您的第二行将数字 20 写入 b 恰好指向的内存位置,在您的情况下,这是导致分段错误的内存位置。

    你想要的是 int *b = new int();为指针分配一个有效的内存位置。

    【讨论】: