为什么& array!=& array [0]?

时间:2013-10-25 16:15:18

标签: arrays memory-management d

在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中的数组可能不仅仅是相邻分配的内容?)

3 个答案:

答案 0 :(得分:12)

在D中,数组本质上是一个带有指针和长度字段的结构,并被视为

获取可以查询ptr字段的第一个元素的地址

答案 1 :(得分:3)

由于“array”本身解析为指向数组的指针,因此在使用结构时,这允许您对类型指针和类型数组进行处理。

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

应该给你你想要的东西。

继承自“C”http://c-faq.com/aryptr/aryptrequiv.html

int[] slice = [...];
int* ptr = &slice[0];

writeln(cast(void*) slice);
writeln(&slice[0]);

// value access
writeln(slice[0]);
writeln(*ptr);
writeln(ptr[0]);

答案 2 :(得分: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 link:http://dpaste.dzfl.pl/f708d945