Seg fault when calling C code
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri May 16 08:24:26 PDT 2014
On 05/16/2014 08:15 AM, Andrew Brown wrote:
> I guess my confusion came about because in the page about interfacing
> with C, there's a static array example where parameters are given in
> terms D understands:
>
> extern (C)
> {
> void foo(ref int[3] a); // D prototype
> }
>
> I guess D has no problem translating that into a simple pointer that C
> can deal with. I assumed the same would be true of dynamic arrays, but
> maybe the leap is too far?
There is a major difference. A static array is direct equivalent of C
arrays when it comes to how they are stored in memory. Static arrays are
simply consecutive elements. (Of course, static arrays are superior to C
arrays in many other aspects. :))
One difference between C arrays is the fact that static arrays are
by-value when passed even to functions. (No more "decaying to pointer to
first element" confusion.)
Since we know that references are implemented as pointers, 'ref int[3]
a' is passed as a.ptr. Since the memory layout is the same as a C array,
it works perfectly.
On the other hand, dynamic arrays (aka slices) are the equivalent of the
following struct:
struct Slice(T)
{
size_t length;
T * ptr; // points to an array of elements
}
Ali
More information about the Digitalmars-d-learn
mailing list