-1

私は最近、基本的なメモリ スキャナを完成させました。これまでにこれを行ったことのあるすべての人と同じように...プログラムが起動するたびに値をスキャンするのは大変なことだと気付きました!

アプリケーションにハード コードできるように、これらの値のベース ポインターを作成すると便利です。これを行う方法を理解するために、「ターゲット」にビジュアル C++ を使用してこの短いコンソール アプリを作成しました。

int main(int argc, char *argv[], char *envp[])
{
    unsigned int * Pointer1;
    Pointer1 = (unsigned int *)malloc(sizeof(unsigned int));
    char s[20];
    while(1)
    {
        std::cout<<"(Pid:"<<GetCurrentProcessId()<<") Please enter a value to be stored in memory (type 'q' to exit): \n";
        std::cin>>s;
        std::cout<<"\n";
        if(s[0] =='q')
        {
            break;
        }
        *Pointer1 = str2int(s);
        std::cout<<"Value:"<<*Pointer1<<" addr:0x"<<Pointer1<<"\n";
    }
    free(Pointer1);

return 0;
}

次に、メモリスキャナーに従ってこのアプリを使用して、ポインターのアドレスとポインターが指すメモリアドレスを計算しました。以下のデータを照合するために、これを数回行いました。(「|」を区切り文字として Excel に貼り付けます)

pid |P Hex|P Val|PHx to Dec|M Hex|M Val|MHx To Dec
7028|002afcfc|216032|2817276|00034BE0|10|216032
6312|0032fa70|4541408|3340912|00454BE0|20|4541408
1512|0043fb1c|3242304|4455196|00317940|30|3242304
8140|0036f9fc|1997096|3602940|001E7928|30|1997096

ただし、ポインターがどのメモリアドレスになるかを計算する信頼できる方法を見つけることはできません。これを行うためにどのような方法/計算を実行できますか? ポインター チェーンの例のようにもっと生き生きとしたものがあることは承知していますが、これは難しくする前の良い出発点のように思えました。

4

2 に答える 2

4

メモリアドレスは、malloc返されるものです。返されるものを計算する信頼できる方法はありません。それはすべて、ライブラリがどのように機能するか、OS によって (またはまたは その他mallocを介して) どの仮想アドレス範囲が与えられるかなどによって異なります。sbrkmmap

于 2012-09-04T22:21:23.490 に答える
0

から返されるアドレスを予測する方法を尋ねていますmalloc

それは問題ではありません。

から何が返されるかを予測できればmallocmalloc何も返す必要はありません。

実際には、malloc からどのアドレスが返されるかは重要ではありませんNULL。malloc の呼び出しは、メモリのバイト数が必要であることを意味します。そして malloc がそれを提供します。あなたは必要なものを手に入れました。

逆に、malloc から返されるアドレスを特定できれば、malloc を呼び出す必要はありません。予測したアドレスをそのまま使用できます。

簡単に言えば、malloc利用可能なメモリを予測するのは簡単ではないため、存在します。

于 2012-09-05T05:38:51.347 に答える