On Friday, 31 August 2018 at 06:20:09 UTC, James Blachly wrote:
Hi all,
I am linking to a C library which defines a symbol,
const char seq_nt16_str[] = "=ACMGRSVTWYHKDBN";
In the C sources, this is an array of 16 bytes (17 I guess,
because it is written as a string).
In the C headers, it is listed as extern const char
seq_nt16_str[];
When linking to this library from another C program, I am able
to treat seq_nt16_str as any other array, and being defined as
[] fundamentally it is a pointer.
No. This is a misconception. Fundamentally, it's an array.
When linking to this library from D, I have declared it as:
extern __gshared const(char)* seq_nt16_str;
***But this segfaults when I treat it like an array (e.g. by
accessing members by index).***
Because I know the length, I can instead declare:
extern __gshared const(char)[16] seq_nt16_str;
My question is: Why can I not treat it opaquely and use it
declared as char* ? Does this have anything to do with it being
a global stored in the static data segment?
For the same reason you can't do it in C.
--- main.c ---
#include <stdio.h>
extern const char* array; /* then try array[] */
int main(void)
{
printf("%.5s\n", array);
return 0;
}
--- lib.c ---
const char array[] = "hello world";
# gcc -o main main.c lib.c
# ./main
Segmentation fault
You need to declare your extern array as array in D and also in
C, so that the compiler would know what that is (an array, not a
pointer). In many situations C compiler would silently convert an
array into a pointer (when it already knows its dealing with
array), but it won't convert a pointer into an array.