使用指针算术C ++进行分段错误

时间:2013-07-03 13:36:19

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

我正在尝试用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 / status

3 个答案:

答案 0 :(得分:6)

在这里,你声明一个指向无处的指针:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

你宣布了 pointer_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;