-3

C ++では、charポインタを使用してメモリ領域に書き込みます。私のcharポインタは次のとおりです。

  unsigned char * writer;
  *(writer++)=0xF1; //example of write

今私の問題は、私が書くと...私のプログラム内の他の書き込みがこのデータを上書きできることです..そのため、私が読んだときに間違った結果が得られます。私は一度だけ書いているので、C / C ++には、このメモリ領域を一定に(そのまま)保つことができる方法があります。これにより、プログラムの他の部分がそれを上書きすることはありません。

4

4 に答える 4

4

移植性はありません。

OSが提供する機能を使用して、メモリページ全体を読み取り専用としてマークできる場合があります。これは、問題のバイトを専用のメモリページに分離できるかどうかによって、機能する場合と機能しない場合があります。それはまた、ちょっとした大ハンマーのアプローチです。

バグを回避するためにこれを実行する場合は、バグを見つけて修正することをお勧めします。たとえば、メモリの破損が疑われる場合valgrindは、非常に便利なツールです。

于 2013-03-27T14:18:16.207 に答える
1

あなたは正確な答えを与えるのに十分な詳細で説明していませんが、私はconstあなたが望むことをするのに十分であるように単にポインタを渡すことを考えたでしょう:

const unsigned char *writer;

おそらく、書き込み機能をクラスにラップconstし、メモリへのアクセスのみを許可します。

class MemWriter
{
private:
    unsigned char *writer;
public:
    const unsigned char *getMemory() const
    {
        return writer;
    }
    //
    // Other methods to perform the writing defined here
    //
};

これは、コードがポインタをnon-にキャストして書き込むのを実際に停止することはありませんconstが、少なくともメモリが読み取り専用であるという意図を示します。

于 2013-03-27T14:18:33.897 に答える
0

定数へのポインタを非定数へのポインタにキャストしないことを信頼できるルーチンから保護しようとしているが、定数として処理する必要があるバッファに誤って書き込む可能性がある場合(たとえば、誤植またはルーチンの記述時の無思慮さのために)、ポインタをconstへのポインタに変換し、それを他のルーチンにのみ渡すだけです。コンパイラは通常、ルーチンがポインタからconstを介して書き込もうとすると、警告またはエラーを発行します。(これには、ルーチンなど、いくつかの穴がありますstrchr。)後でメモリを解放するときに、non-constへの元のポインタの記録が必要になるか、ポインタを「強制的に」キャストする必要があります。 to-constはpointer-to-non-constに戻ります。

ルーチンがバッファをオーバーフローしたり、大幅に迷ったりする可能性のあるバグから保護しようとしている場合は、コンピューティングプラットフォームがmprotect呼び出しを提供しているかどうかを確認してください。これには、ページに合わせたアドレス(プラットフォームでなどの呼び出しがある可能性がある)にページサイズ単位でメモリを割り当てる必要がありますvalloc。繰り返しになりますが、メモリを解放するときは、保護を変更して再度書き込みを許可する必要がある場合があります。

于 2013-03-27T14:26:52.293 に答える
0

C ++では、アドレス(32ビット/ 64ビット整数)があれば、プログラムで使用可能なアドレス空間に書き込むことを妨げるものは何もありません。偶発的な上書きを防ぎ、読者にあなたの意図を明確にするために、constのようなキーワードを使用してください。以下のコードでは、32ビットマシンを想定して、アドレス番号を操作する方法を見てみましょう。

int main()
{
    int i = 998979789;

    std::cout << i << std::endl;

    int j = (int)(&i);// get the address number

    char * m = (char*)j; // change to a char*

    char old = m[0]; // store the  char for later use

    m [0] = 'A'; // write over the memory

    std::cout << i << std::endl;

    m[0] = old; // again write to bring it back

    std::cout << i << std::endl;

    return 0;
}
于 2013-03-27T14:58:42.540 に答える