我正在尝试用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
答案 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)
int* pointer_s3_1_a = new int();
*pointer_s3_1_a = 100;
...
int* pointer_s3_1_a2 = new int();
*pointer_s3_1_a2 = 100;