我有一个带有
static int c[100];
的头文件 foo.h。如果我在 main.c 中包含 foo.h,它会创建 c[100] 的另一个实例。如果我在 bar.h 中再次这样做,我会得到另一个实例:
foo.h:
#ifndef FOO_H
#define FOO_H
static int c[100];
void foo(void);
#endif
foo.c
#include <stdio.h>
#include "foo.h"
void foo(void)
{
c[0] = 100;
printf("c: %d \taddress: %p \t size: %lu\n", c[0], (void *)&c, sizeof(c));
}
bar.h
#ifndef BAR_H
#define BAR_H
void bar(void);
#endif
bar.c
#include <stdio.h>
#include "bar.h"
#include "foo.h"
void bar(void)
{
c[0] = 111;
printf("c: %d \taddress: %p \t size: %lu\n", c[0], (void *)&c, sizeof(c));
}
main.c
#include <stdio.h>
#include <unistd.h>
#include "foo.h"
#include "bar.h"
int main()
{
c[0] = 22;
printf("c: %d \taddress: %p \t size: %lu\n", c[0], (void *)&c, sizeof(c));
foo();
bar();
return 0;
}
结果显示我在不同地址的内存中有三个块,每个块有 400 字节:
c: 22 address: 0x102de4000 size: 400
c: 100 address: 0x102de4190 size: 400
c: 111 address: 0x102de4320 size: 400
所以它使用 1200 字节内存,对吗?
除此之外,这只是一个示例,其中数组可能会更大(因此我将使用带有运行时内存分配的指针):
如果您只想要一个数组,请不要在头文件中define它。
extern
在标头中声明,并在 foo.c
文件中定义它。此外,使其 static
确保每个翻译单元获得数组的唯一实例。
foo.h
:
#ifndef FOO_H
#define FOO_H
extern int c[100]; // note the extern declaration
void foo(void);
#endif
#include "foo.h"
#include <stdio.h>
int c[100]; // here's the definition
void foo(void)
{
c[0] = 100;
printf("c: %d \taddress: %p \t size: %lu\n", c[0], (void *)&c, sizeof(c));
}
这样,所有包含
foo.h
的翻译单元都将在 c
中定义 foo.c
,因此它们只会共享一个数组。