2016-06-27 9 views
0

ポインタと配列を使用して作業しています。ここでは、配列がメモリ内でどこから始まるか、またはポインタが保持するメモリアドレスを指定する必要があります。ポインタまたは配列はアドレスを取ります。しかし、私は値を尊重したり割り当てることができません。特定のメモリアドレスが割り当てられたポインタを参照解除する

次のコードを実行しようとしましたが、Segmentation Faultが発生しました。私はここで間違って何をしていますか?助けてください!配列のコード次

int *a = (int *)0x100; 
cout << a << endl;   //prints out 0x100 
*(a) = 10;  <------ seg fault on this line 

int *b = new b[10]; 
b = (int *)0x0; 
cout << b << endl;   //prints out 0x0 
b[0] = 10;  <---- seg fault on this line 
+0

あなたが間違っていることは、割り当てられていないメモリアドレスにアクセスしようとしています... – immibis

+0

ランダムな値にポインタを設定するだけで、逆参照できないと思います。 *有効なメモリアドレス*に設定する必要があります。あなたが本当にやろうとしていることがはっきりしていないので、正しい方法を示唆することはできません。そして、一つの言語だけを選んでください。 CとC++は異なる言語であり、実際に興味のある言語(C++のように見えます)に応じて答えが異なる場合があります。 – kaylum

+0

組み込みシステムで実行されるこのコードはありますか? 0x100が有効なアドレスであり、そこにメモリが含まれているかどうかによって、動作する可能性があります。 –

答えて

0

は、あなたがそのためセグメンテーションフォルトされ、int型Aのための第1のメモリを割り当てます。

int *a = new int; 
*a = 10; 
delete a; 

2番目のケースでは、ヌルポインタも逆参照しています。あなたはゼロをアドレスするためにbを設定する必要はありません。私はあなたの配列を失うと信じています。

2

私はここで間違っていますか?

オブジェクトを指していないポインタを逆参照しています。これには未定義の動作がありますが、運が良ければ、OSはそのミスを検出してSEGフォールトを発生させる可能性があります。

解決方法:最初にオブジェクトにメモリを割り当てます。どのように割り当てる必要がありますかは、オブジェクトをどのように使用するかによって異なります。オブジェクトを割り当てるための簡単な方法は、自動変数を使用することである。

int main() { 
    int object; 
    int* pointer = &object; // now you can assign the pointer to the specific memory address of the existing object 
    *pointer  = 10;  // dereferencing is OK 
} 


flag 

をポインタでないであろう指定されていないオブジェクトのアドレスをとりますか?

ポインタは、指定されたオブジェクトのアドレスをとります。コンパイラは、アドレスの内容を指定します。

どのように私は、キャストを使用して0x100の...

に対処するために、ポインタのポイントを作ることができます。あなたのプログラムはすでにそれをしています。

...私の目的のためにそのメモリを使用しますか?

標準C++では任意のメモリを使用できません。あなたの問題に対処するためのプラットフォーム固有の方法に頼る必要があります。

+1

まさに私が書くつもりだった。シンプルで正確な答え。 – Mirakurun

+0

ポインタは指定されていないオブジェクトのアドレスをとらないでしょうか?ポインタを0x100のアドレスに設定し、そのメモリを私の目的に使用するにはどうすればよいですか? –

+0

@ E.Mikke更新を参照してください。 – user2079303

関連する問題