2017-02-20 15 views
-4

このプログラムがクラッシュするコード行を書き出す正しい方法を誰かが知っていますか?C++でのポインタの問題

#include <cstdlib> 
int position[10]; 

struct ONE { 
    int* ptr; 
}; 

int* f(int x) { 
    return position + x; 
} 

int main() { 
    ONE * main_ptr = NULL; 
    main_ptr->ptr = f(4); // <-- crash 
    return 0; 
} 

誰かが見つけることができれば、私は本当にGREATFULだろう:私はこれがNULLのメモリセルに値を代入しようとによって引き起こされることがわかってきましたが、私はそれを正しく書くためにどのように苦労しています
問題を解決して助けてください

+2

言語の名前はC++ではないCPP(「CPP」は、多くの場合、Cプリプロセッサを指しています)。プログラムが異常終了すると、通常は「クラッシュ」と呼ばれ、「クラッシュ」とは呼ばれません。 "double pointer"というフレーズは、 'double *'型を参照することができます。私は、 "ポインタへのポインタ"というフレーズを使用することをお勧めしますが、それはあなたがここにいるものではありません。 'main_ptr'は、ポインタを含む構造体へのポインタです。 –

+0

「ダブルポインタ」はありません。ポインターへのポインターがあります。そして、それは「クラッシュ」ではなく「クラッシュ」します。 –

答えて

0

明らかに、main_ptrはヌルであるため参照できません。ポインタを逆参照するためには、ポインタはオブジェクトを指す必要があります。それを修正するための一つの方法:

ONE one; 
ONE * main_ptr = &one; 

// as before 

あなたはまた、(<memory>を使用して)オブジェクトを動的に割り当てることができます。

std::unique_ptr<ONE> p_one = std::make_unique<ONE>(); 
ONE * main_ptr = p_one.get(); 

// as before 
+0

[デモ](https://ideone.com/1BNoWQ)、[代替デモ](https://ideone.com/KEayD2)。 –

+0

うわー、答えてくれてありがとう!私はそれを知らなかった。ありがとうございました! –

関連する問題