​原文​

struct ArenaChunk {
size_t size;
ArenaChunk* next;
char[] memory; // 动态数组成员.
}

struct Arena {
ArenaChunk* firstChunk;
ArenaChunk* currChunk;
int currInd;
}

fam分配内存:

void* result = cast(void*)(&ar.currChunk.memory + ar.currInd);

不​​,D​​​不支持灵活​​数组成员​​​或​​动态大小​​​结构.
​​​char[]​​​是​​D切片​​​,它与​​C数组​​​不同.切片基本上是一个​​指针+长度对​​:

struct char[] {//仅为描述
char* ptr; //首元素指针
size_t length;
}

​分配代码​​​可能只是​​偶尔​​​起作用,并且可能会导致​​内存破坏​​:

void* result = cast(void*)(&ar.currChunk.memory + ar.currInd);

​&ar.currChunk.memory​​​不会给你​​第一个​​​切片元素指针,它给你切片自身(​​char[]​​​结构)指针.要获得可用的​​第一个​​​元素的指针,可用​​ar.currChunk.memory.ptr​​​,但由于最终目标是取​​ar.currInd​​​元素指针,因此最好替换​​整行​​为:

void* result = &ar.currChunk.memory[ar.currInd];

(这样,可检查越界).
对​​​原始内存数组​​​来说,​​void[]​​​比​​char[]​​​更合适(​​char[]​​​在D中几乎完全用于"​​可变串​​​",且根据实现,​​垃集​​​可能不会扫描​​char[]​​​元素​​指针​​).

我认为在D中​​最接近​​​方法是使用​​零长度​​静态数组:

struct ArenaChunk {
size_t size;
ArenaChunk* next;
char[0] memory;
}

​使用示例​​:

void* result = cast(void*)(ar.currChunk.memory.ptr + ar.currInd);

注意,在D中,必须用​​.ptr​​​来获取数组​​首元素​​​指针;它不会像​​C中​​​那样自动​​变成指针​​.