No, D does not support flexible array members or dynamically sized structs.

`char[]` is a D slice, which is NOT equivalent to a C array.
A slice is basically a pointer+length pair:
```d
// you can't actually name a struct `char[]`, it's just for explanation purposes
struct char[] {
    char* ptr; //pointer to first element
    size_t length;
}
```

Also the allocation code probably only worked by accident and will likely cause memory corruption:
```d
void* result = cast(void*)(&ar.currChunk.memory + ar.currInd);
```
`&ar.currChunk.memory` doesn't give you a pointer to the first slice element - it gives you a pointer to the slice itself (the `char[]` "struct"). To get a pointer to the first element you can use `ar.currChunk.memory.ptr`, although since the end goal is to get a pointer to the `ar.currInd` element it's preferable to replace the entire line with this:
```d
void* result = &ar.currChunk.memory[ar.currInd];
```
(this way you get bounds checking on slice indexing so you can't get a pointer past the last element of the slice).

Also `void[]` is a more appropriate type for a raw memory array than `char[]` (`char[]` in D is used almost exclusively as "mutable string", and depending on the implementation the garbage collector may not scan `char[]` elements for pointers).

Reply via email to