【问题标题】:Segmentation Fault with pointer arithmetics C++指针算法的分段错误 C++
【发布时间】:2013-07-01 05:35:39
【问题描述】:

我正在尝试学习一些 C++ 中指针算法的操作。下面编写的代码向我抛出了分段错误。我无法理解程序如何尝试访问未分配的内存来导致分段错误。

C++ 代码 (myarray.cc)

#include<iostream>
using namespace std;

int main(int argc, char** argv)
{
  int * pointer_s3_1_a;
  int * pointer_s3_1_a2;
  int value_s3_1_a, value_s3_1_a2 ;

  *pointer_s3_1_a=100;
  cout<<"pointer_s3_1_a, *pointer_s3_1_a "<<pointer_s3_1_a<<' '<<*pointer_s3_1_a<<endl;
  value_s3_1_a=*pointer_s3_1_a++; 
  cout<<"value_s3_1_a, pointer_s3_1_a, *pointer_s3_1_a "<<
    value_s3_1_a<<' '<<pointer_s3_1_a<<' '<<*pointer_s3_1_a<<endl;

  cout<<"pointer_s3_1_a2, *pointer_s3_1_a2 "<<pointer_s3_1_a2<<' '<<*pointer_s3_1_a2<<endl;

  *pointer_s3_1_a2=100; //Runtime error |** Segmentation fault (core dumped) **|

  return 0;
}

我正在使用 g++ 编译器在 Ubuntu 12.04 中运行该程序。在终端上运行 apt-cache policy g++ 给了我以下输出。

g++:已安装:4:4.6.3-1ubuntu5 候选:4:4.6.3-1ubuntu5
版本表:* 4:4.6.3-1ubuntu5 0 500 http://archive.ubuntu.com/ubuntu/ 精确/主要 i386 包 100 /var/lib/dpkg/状态

【问题讨论】:

  • int * pointer_s3_1_a; ... *pointer_s3_1_a=100; 是 UB。请通过一本书学习 C++。不要把代码扔进去并期望它能够工作。

标签: c++ pointers g++ segmentation-fault


【解决方案1】:

在这里,你声明了一个不指向任何地方的指针:

int * pointer_s3_1_a;

在这里,您尝试将它指向的事物的值设置为100

*pointer_s3_1_a=100;

这是未定义的行为,可能会导致分段违规(尽管不是必须的,但可能会发生许多错误的事情,而且并不像分段错误那样明显。你很幸运)。

你必须首先让你的指针指向一个有效的地方。例如,

int n = 42;
pointer_s3_1_a = &n; // pointer points to n
*pointer_s3_1_a=100; // set the value of the thing it points to (n) to 100

【讨论】:

    【解决方案2】:

    您不能将数据写入未初始化的内存区域:

    int * pointer_s3_1_a;  // NOT Initialized (possibly 0)!!!
    *pointer_s3_1_a=100;   // Undefined behaviour
    

    【讨论】:

    • 实际上不太可能是0。页面错误只是一种可能的结果。
    • @LightnessRacesinOrbit OK,固定 cmets。
    【解决方案3】:

    你已经声明 指针_s3_1_a 和 pointer_s3_1_a2 作为指针,但实际上没有可指向的内存,因为您错过了分配/创建它们。 你应该这样做:

    int* pointer_s3_1_a = new int();
    *pointer_s3_1_a = 100;
    

    ...

    int* pointer_s3_1_a2 = new int();
    *pointer_s3_1_a2 = 100;
    

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 2016-02-24
      • 1970-01-01
      • 2012-04-10
      • 2021-05-25
      • 2016-01-02
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多