Say, there is a proc.h which defines an array like
proc.h:
struct proc
{
char p_stat;
char p_flags;
int p_pid;
} proc[100];
The code above actually not only defines the data structure struct proc, it also declares/allocates an array of them for each file including the header.
A widely used idiom is to define the data structure with a typedef, like so:
typedef struct
{
char p_stat;
char p_flags;
int p_pid;
} proc_t;
or just plain old defining the structure without the typedef:
struct
{
char p_stat;
char p_flags;
int p_pid;
} proc_t;
and then in the c-file matching the header, you'll instantiate your array of structs:
proc_t proc[100]; // if you've typedef'd the struct
struct proc_t proc[100]; // if you haven't typedef'd
and then in all the c-files including the header, wanting access to this global struct, you'll declare the variable extern. That way, all the c-files will share access to a single data structure.
I prefer to typedef a structure in a single header and encapsulate it by only accessing/manipulating instantiations of that data structures through function calls (objects passed by address), but that is a matter of personal taste and whatevs.