6

以下の本当に単純なコードを考えてみましょう。

#include <stdio.h>
#include <stdlib.h>
int main() {

    int* a = (int*) malloc(10 * sizeof(int));
    printf("a = %p, a+1 = %p", a, a+1);
    return 0;
}

出力は次のとおりです。

a = 0x127f190, a+1 = 0x127f194

anのサイズintは4バイトなので、上記の結果から、ポインタ値はRAMメモリ上の1バイトのインデックスであると想定しています。したがってa+1、実際にはの値が(バイト)増加しaますsizeof(int) = 4。あれは正しいですか?

はいの場合、プログラムから32ビットのメモリアドレスを取得するのはなぜですか?このマシンは64ビットバージョンのUbuntuを実行している64ビットです。プログラムで完全な64ビットアドレスを出力するにはどうすればよいですか?特別なフラグを使用してコンパイルする必要がありますか?

4

5 に答える 5

7

あなたはあなたのポインタについて正しいです。メモリは伝統的にバイト単位で編成され、アドレス指定されます。ポインターは、それらが指しているものの最初のバイトを指します(編集:そうする必要はありませんが、通常のプラットフォームとコンパイラーではそうします)。

出力が先頭の 0 を削除するという理由だけで、「64 ビット」ポインタが表示されていません :-) sizeof(a) を実行すると、32 ビット システムでは「4」、「8」が得られる可能性があります。 64ビットシステム上。

于 2012-08-26T18:30:57.303 に答える
4

RAMメモリ上のバイトのインデックス

これはほとんどの目的に十分近いですが、完全に正確というわけではありません。これは、プロセスのアドレス空間にあるバイトのインデックスです。仮想アドレスは物理RAMに直接関係していません。「仮想メモリマネージャ」と呼ばれるものがあり、各プロセスのどの仮想アドレスがどの物理RAM(およびRAM以外のもの)を参照しているかを追跡します。

通常、これを忘れて、仮想アドレス空間をRAM(または抽象化を維持するための「メモリ」)と考えることができます。ただし、異なるプロセスの同じ仮想アドレスが異なる物理メモリを参照したり、同じメモリが異なる仮想アドレスによって異なるプロセスで参照されたりする可能性があります。または、同じプロセス内の同じ仮想アドレスが異なる時間に異なる物理メモリを参照する可能性があります。OSがページがしばらく使用されていないことに気付いた場合は、ページをディスクにスワップしてから、再度使用するときにメモリに戻します。したがって、これは実際にはRAM自体の「アドレス」ではなく、プロセスがOSから指定されたアドレスであり、一部のRAMを参照します。

于 2012-08-26T19:08:45.313 に答える
1

The reason you're seeing an increase of four is because you're allocating memory for integers, which are fixed at four bytes long (in Intel Linux gcc) -- whether you've compiled 32bit or 64bit code. As already said, the pointers you get refer to virtual memory addresses, not physical memory.

If you change your int to long, you'll see a 4 byte increase with 32bit code and an 8 byte increase with 64bit code.

Additionally, if you look at sizeof(void *) it will tell you if your pointers are 32bit or 64bit. If your pointers are 64bit, then you'll be getting 64bit pointers printed with %p.

I edited your program to run on my copy of Ubuntu, adding:

printf("Size of pointer = %d\n", (int)sizeof(void *));

Here's the output:

a = 0x2067010, a+1 = 0x2067014
Size of pointer = 8

So the pointer is indeed 64bit.

于 2012-08-27T10:12:00.097 に答える
0

あなたが書いたときint* a = (int*) malloc(10 * sizeof(int));、あなたは10個の要素の配列にメモリを割り当てていました。これは、最初の要素のアドレスと同等でint a[10];あり 、です。a = 0x127f190a[0]

于 2012-08-26T18:29:35.407 に答える
0

申し訳ありませんが、正確な答えを示していません。しかし、ここに来ます:

を探してくださいPointer Arithmetic。探しているものがすべて見つかります。

システムで x64 を実行している場合でも、x64 用にコンパイルすることを明示的に宣言しない限り、ほとんどのコンパイラはデフォルトで x86 を使用します。そのため、コンパイラのドキュメントで x64 フラグと関連するオプションを検索してください。

于 2012-08-26T18:30:47.127 に答える