4

C:

int a[10];
printf("%p\n", a);
printf("%p\n", &a[0]);

収量:

0x7fff5606c600
0x7fff5606c600

これは私が期待するものです。今、Dで、私はこれを試しています(明らかにユースケースはなく、ただ浮気しています):

int[] slice = [...];
writeln(&slice);
writeln(&slice[0]);

収量:

7FFF51600360
10E6E9FE0

違いはなぜですか?完全に異なるメモリ セグメントのように見えます。(おそらく、D の配列は単に隣接して割り当てられた int ではないことに気がつきましたが?)

4

3 に答える 3

12

D では、配列は基本的にポインターと長さフィールドを持つ構造体であり、そのように扱われます。

最初の要素へのアドレスを取得するには、ptr フィールドをクエリできます

于 2013-10-25T16:28:41.267 に答える
3

簡単です - 動的 D 配列は C 配列と同じではありません。動的 D 配列は配列の長さを保持しますが、C 配列は保持しません。そのため、動的 D 配列は、配列の終わりをマークするために NULL に依存しません。Adam がコメントで指摘しているように、静的 D 配列は C 配列と同じように動作します。

import std.stdio;

int main() {
  // static array
  int[10] sarr;
  writeln(sarr.length);
  writeln(&sarr);
  writeln(&sarr[0]);

  // dynamic array
  int[] darr = [1, 2, 3];
  writeln(darr.length);
  writeln(&darr);
  writeln(&darr[0]);

  // These are all the same
  writeln(darr.ptr);
  writeln(cast(void*) darr);
  writeln(&darr[0]);

  return 0;
}

(DPaste リンク: http://dpaste.dzfl.pl/f708d945 )

于 2013-10-26T13:33:18.667 に答える