2012-03-16 10 views
0

から1つのCポインタのデータにアクセスする方法は、私は2つのプログラムを持ってあり、「こんにちは」は別のCプログラム

プログラムAは、このようなものです、

int main(int argc, char** argv) { 

    char* s = "hello"; 

    printf(s); 

    return (EXIT_SUCCESS); 
} 

Sのベースアドレスは0x80484e0です、今私は、プログラムB「P」で

int main(int argc, char** argv) { 

    void* p = (void*)0x80484e0; 

    char* c = (char*)p; 

    while(*c) 
    { 
     printf("%c",*c); 
     c++; 
    } 

    return (EXIT_SUCCESS); 
} 

次のようにプログラムBで「S」と同じベースアドレスにプログラムB指しているが、内容は同じではありません。

'p'と 's'は同じベースアドレスを持っていますが、内容は同じではありませんが、異なるアドレス空間で異なるプログラムとして実行されているためですか?

+1

あなたが参照しているアドレスは、各プログラムに固有のものでなければなりません。他のプログラムが初期化されている場所を見つけるためにOSをポーリングする必要があります。 –

+2

各プログラムは、独自の仮想アドレス空間に存在します。オペレーティングシステムは、仮想アドレスを物理アドレスにマップする(または物理アドレスにページングする)。あるプロセスの仮想アドレスは、別のプロセスでは意味がありません。 – dreamlax

答えて

4

プログラムBでは、 プログラムBでは 'p'は 's'と同じベースアドレスを指していますが、内容は同じではありません。

これは仮想アドレスと別のアドレススペースの魔法です。お使いのプラットフォームに合わせて "共有メモリ"を調べる必要があります。

プログラムによって使用されるアドレスは、仮想です。それらはRAMの物理アドレスと同じではありません。カーネルは、MMUとページテーブルの助けを借りて素敵な(厄介な)ものを作り、それをプロセスから隠します。

たとえば、32bシステムでは、プロセスはメモリの唯一のユーザーだと思っています.0から0xffffffffまでのアドレスを一定の制限付きで使用できます。

POSIXシステムを使用している場合は、mmapshm_openを調べることができます。

+0

@AnanthaKrishnan:いいえ、 'malloc'から返されるアドレスはプロセス固有の仮想アドレスです。仮想アドレスが実際に指している場所はOSだけが知っています。 – dreamlax

2

オペレーティングシステムをほとんど使用している場合は、virtual memoryのコンセプトがあります。したがって、あるプロセスの特定のメモリアドレスは、他のプロセスで必ずしも同じではありません。たとえそれが同じ物理アドレスにマッピングされたとしても、そのプロセスを「所有していない」メモリにアクセスしているので、それを読み取ろうとするとsegmentation faultが得られます。

0

これは決してうまくいかないと私は信じています。

プログラムAでは、「hello」は実行可能ファイルに付属する文字列で、プログラムを呼び出すとメモリに読み込まれます。

関連する問題