【问题标题】:Segfault Pointers [duplicate]段错误指针[重复]
【发布时间】:2013-12-16 00:18:43
【问题描述】:

我是 C++ 和指针的新手,并在下面写了一个简单的 cpp。我不断收到段错误,但我不知道为什么。

int main() {
    int *x = 0; 
    *x = 8; 
    return 0; 
}

【问题讨论】:

  • 8 存储在内存的哪个位置?
  • 那么接近的投票应该被列为“重复”而不是“离题”,并且应该有 cmets 指向问题的规范版本。混淆指针和指向的类型是一个常见问题,而不是一个完整的编程主题。当然,问题标题可能会更好,但要做到这一点,就需要事先了解答案。提问者不仅提供了一个清晰简洁的问题,还提供了最少的可重现代码。
  • @Jherico "Pointers" 是一个完整的话题,确实如此。如果对某人来说,乍一看并不清楚为什么 int *x = 0; *x = 8; 本质上是完全错误的,那么该人需要学习指针。 这不仅是一个“常见问题”,而且表明OP根本不知道指针这一事实。这就是为什么他应该去他当地的图书馆拿 K&R C,而不是浪费我们的时间。
  • 如果您能找到重复的内容,请将其发布,以便我们将用户引导至正确的问题。
  • @Jherico 标题将帮助来自 Google 的未来访问者。请花一些时间写一个更清晰的标题来帮助大家。这样,如果它是重复的,则更容易发现重复,如果不是,则更容易声称它不是。此外,仅仅因为错误的原因关闭问题并不意味着应该重新打开它。将其标记为正确的关闭原因,我们很乐意这样关闭。

标签: c++ segmentation-fault


【解决方案1】:

您的整数指针为空。看到这一行:

int *x =0

在该行上,您将整数指针的内存地址设置为零(即 nullptr)。我希望你想要做的是将值设置为零,在这种情况下你需要这样做:

int main() {
  int *x = new int(0);
  *x = 8;
  return 0;
}

【讨论】:

    【解决方案2】:

    您已经声明了一个指向整数的指针并将其设置为 0。实际上您并没有在任何地方分配整数。当您将 8 分配给取消引用的指针时,您正在尝试写入位置 0 的内存。所有现代操作系统都在地址 0 及其附近的任何位置读取和写入内存,以防止这种“空指针错误”。

    将计算机上的内存想象成一张方格纸。纸上的每个方格都有一个地址,即前面的方格数。指针用于存储这些地址。 int 是一个实际值,例如“5 个苹果”或“12 个不赞成投票的混蛋”。这些是通过在其中一个矩形内写入数字来存储的值。

    但是,管理系统的操作系统知道人们最常犯的错误之一是忘记正确设置指针并试图在方格纸的开头写数字,因此它设计了图表如果您尝试在前几个框中的任何一个中写一个数字,就会触电。这是您的分段错误。

    要解决此问题,您可以在堆栈上声明一个整数

    int i;
    int * x = &i;
    

    在栈上声明一些东西意味着当它离开作用域时内存将被自动释放,即函数结束。

    另一方面,你可以在堆上分配一个指针

    int * x = new int;
    

    这意味着您个人有责任确保稍后释放内存。

    delete x;
    

    否则会造成内存泄漏。

    【讨论】:

    • 这是否定义为分段错误呢?抱歉,我也在努力熟悉术语
    • 错误的显示方式因编译器和操作系统而异,但是是的,当您尝试写入内存时,就会出现分段错误,因为操作系统将位置 0 的内存标记为无法访问。在 Unix / Linux 上,操作系统会立即停止您的程序并出现分段错误。
    【解决方案3】:

    当您定义int *x = 0 时,您告诉编译器的是“创建一个整数指针 x,并将它指向的位置设置为 0 (NULL)”。您需要做的是动态创建一个新指针。这可以通过int *x = new int;来实现,然后你可以改变它的值。使用后,请使用delete x;删除,释放内存。

    【讨论】:

      【解决方案4】:
      int *x = 0; 
      

      您创建了一个名为 x 的 int 指针,它指向位置 0 处的内存。

      *x = 8; 
      

      您尝试将值 8 写入内存位置 0 处,该位置存储在 x 中。由于此内存不属于您,因此操作系统终止了您。

      【讨论】:

        【解决方案5】:

        让我们稍微分解一下:

        int *x = 0
        

        这一行创建了一个名为 x 的指针并将其指向 NULL(或无处)

        *x = 8
        

        只要您“取消引用”x,这里就会立即出现问题,这意味着询问与 x 指向的相关联的空格。

        由于您将 x 指向 NULL,因此您要求的是位于 NULL 的 int。这是非法的,因为 NULL 是导致 seg-fault 的无效内存空间。

        【讨论】:

          猜你喜欢
          • 2019-07-08
          • 1970-01-01
          • 2018-07-20
          • 2021-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-23
          相关资源
          最近更新 更多