2

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/precision/main i386 パッケージ100 /var/lib/dpkg/ステータス

4

3 に答える 3

7

ここでは、特定の場所を指していないポインターを宣言します。

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
于 2013-07-03T13:38:54.880 に答える
2

初期化されていないメモリ領域にデータを書き込むことはできません。

int * pointer_s3_1_a;  // NOT Initialized (possibly 0)!!!
*pointer_s3_1_a=100;   // Undefined behaviour
于 2013-07-03T13:39:45.877 に答える
2

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;
于 2013-07-03T13:44:38.943 に答える