2016-07-25 16 views
-1

私はC言語を初めて使用しています。私はJavaについてより多くの背景知識を持っています。 私はアドレスがint値を格納しないので、findメソッドは私に最も可能性の高いセグメンテーションフォールトを与えるポインタポインタを使用してメモリを繰り返し処理する

#include <stdio.h> 

void main(){ 

    int value = 10; 
    find(value); 
} 

void find(int value){ // will change this to return array of long or int depending on which is better 

int* intPointer; 

    for(int i = 40000; i < 40400 ; i+= 32){ /* not sure if i do it like this or another way, 
               * the starting value, ending value and condition 
               * is just for testing purpose */ 

     intPointer = (int*)i; 

     if(*intPointer == value){ 
      printf("found value"); //will actually be storing it to an array instead 
     } 
    } 
} 

を使用してメモリ内の値の検索を試してみたいです。メモリアドレスにどのようなタイプのデータが格納されているかを知る方法はありますか?

同様のタスクを達成するより良い方法はありますか?説明してください。実際のプログラムにはint value = ??がありません。代わりにfindメソッドだけがこの値を含むアドレスの配列を取得するために使用されます。

また、アドレスintまたはlongを保存するのに最適なタイプは何ですか?

+0

*未定義の動作*を呼び出すことができます。結果はシステムに依存し、OSがアクセスするためにアドレスがprohivitedである場合、そこにアクセスするとOSによってプログラムが殺されることになります。あなたは 'void main()'を書いたので、マイクロコントローラのような独立した環境でこのコードを実行したいかもしれません(しかし 'printf()'はそこでサポートされていないかもしれません)。とにかく、宣言されていない関数の使用は悪いことに注意してください。 – MikeCAT

+1

割り当てられていないメモリにアクセスしています.C/C++では未定義の動作なので、そのようにメモリをチェックすることはできません。ちなみに、intのサイズは実装に依存します:ループをインクリメントするには、32の代わりに 'sizeof(int)* 8'を使うべきです。なぜあなたは最初にそれをしたいのですか?たぶん私たちはあなたに別の方法を提案する可能性があります – wasthishelpful

+0

アドレスを格納するための最良のタイプは(適切なタイプへの)ポインタです。 'int'と' long'は、互換表現と適切なサイズを持っているかもしれません。 – Dmitri

答えて

0

ループ内に一時的な変数を持つポインタを偽っています。 値を検索する正しい方法は、検索する値と検索するいくつかの値を含むコレクション(たとえば、配列)の2つの引数を持つことです。

1

一般的なポータブルな方法で試してみる方法はありません。コードは、割り当てられていないメモリにアクセスしているとき、未定義の動作を生成します。

単純な組み込みシステムでは、可能かもしれません。まず、システムのメモリレイアウトとコンパイラの仕組みを完全に把握しておく必要があります。たとえば、intが常にメモリの4バイトアライメント、RAMの開始/終了アドレスであるかどうかを知る必要があります。 MMUが存在し、アクティブである場合、その動作方法も知っている必要があります。

メモリアドレスにどのようなタイプのデータが格納されているかわかります。

2

カップルの右バット知るべき事:

  1. メモリーは常に(メモリモデルのようなように見えても)物理的に連続であることが保証されていません。
  2. Knowing what a segfault isにもアドレスがint値に

    が格納されていないので、何segmented memorymemory protectionは一般

でfindメソッドは私に最も可能性の高いセグメンテーションフォールトを与えているとして、参考になります私はあなたがメモリアドレスをループして特定の値を見つけようとしていると言えます。技術的には可能ですが、実際にはほんのわずかな場合を除いてそれを行う理由はありません。

あなたのオペレーティングシステムでは、あなたのオペレーティングシステムがメモリをかなり知的に扱います。線形の順序で与えられたすべてを配置するのではなく、プロセスAのメモリがプロセスBのメモリと干渉するのを防ぐために、(またはセグメント)のメモリをそれぞれのアドレス空間に分割します。どのプロセスがメモリ内にあるかを追跡するために、マッピングメカニズムが使用されます。

プログラムの割り当てセグメント外のメモリにアクセスしようとしました。あなたがしたいと思うことをするには、OSからメモリマップを取得する方法を見つける必要があります。

私は少なくともないあなたが望む方法で、メモリアドレス

Noに格納されてどのような種類のデータを見つけることができる方法があります。 A couple SO answers address this

関連する問題