6

次の配列があるとします。

int list[3]={2,8,9};
printf("%p,%p,%p",(void*)&list[0],(void*)&list[1],(void*)&list[2]);

&list[0]<&list[1]<&list[2]は常に保証されていますか?

私はCを使用している間、それは難しくて速いルールだと思っていましたが、私が彼の質問に答えたときにOPがちょうどそれについて私に尋ねたので、今はそれについて非常に確信する必要があります.endianness

リトルエンディアンまたはビッグエンディアン

stacks can grow up or down考え直したのは問題です。それについてはよくわかりませんので、厳密な回答をいただければ幸いです。ありがとうございます。

4

3 に答える 3

5

C標準から(「セクション6.2.5型」):

...配列型は、連続して割り当てられた空でないオブジェクトのセットを表します...

配列は「メモリ」に連続して割り当てられます。

Eric と Interjay が言っていることは、私が最初にこれを書いたときに考慮しなかったことです。Eric と Interjay に感謝します。これは仮想メモリ アドレスにのみ適用されるということです。

お使いのマシンと OS は、仮想アドレス空間 (作業している場所) を作成し、これをチャンク サイズのブロック (ページ) で物理メモリにマップするメモリ管理ユニット (MMU) を使用する可能性があります。

つまり、Eric と Interjay が言っているのは、仮想アドレスは連続していますが、それらがマップする物理メモリのチャンクは異なるアドレスにある可能性があるということです。

 Virtual               Physical
+----------+           +----------+
|          |           |
| VMA pg 1 |---------->| PMA 88 (VMA1)
|          |           |
+----------+           +----------+
|          |\           ...
| VMA pg 2 | \          ...
|          |  \         ...
+----------+   \        ...
             \  \       ...  big gap in physical
              \  \      ...  memory
               \  \     ...
                \  \    ...
                 \  >--+----------+
                  \    |
                   \   | PMA 999 (VMA2)
                    \  |
                     >-+----------+

そのため、小さい配列 (ページ サイズより小さい) の場合、これは VMA と PMA アドレスの両方に当てはまる可能性がありますが、PMA != VMA である可能性が最も高いです。ページ サイズより大きい配列の場合、VMA は連続しているように見えますが、上の図が示すように、PMA はバラバラで順序が正しくない可能性があります...

また、Interjay と Eric はさらに一歩進んで、C モデルでは連続していても、C アドレスはメモリ内のどこにでもある可能性があると言っていると思います。ほとんどのOSは仮想から物理へのマッピングを取得するために何らかのページングを実装しているため、これはありそうにありませんが、技術的にはそうであると思います...これは検討することを学ぶのに良いことでした。ありがとうチャップス:)

于 2013-05-06T11:00:52.310 に答える
4

C モデル内でメモリがどのように表示されるかについて質問している場合、配列は C コードで連続しているように見え、C 式&list[0] < &list[1]true です。

C 実装内で実際のメモリがどのように表示されるかについて質問している場合、C 標準では、メモリ内の配列の特定の配置は必要ありません。ほとんどの C 実装では、配列に対して連続して昇順の仮想メモリを使用しますが、降順のアドレスは単純なバリエーションです。また、物理メモリのレベルでは、配列は一般に連続していません。これは、仮想メモリから物理メモリへのマップが、使用可能なものに基づいてオペレーティング システムによって決定され、プロセスの実行中に変更される可能性があるためです。

さらに、出力される文字列%pがメモリ アドレスであるという保証はありません。

于 2013-05-06T10:55:24.827 に答える