我正在用纯 C、RHEL 5.5 x64、gcc 版本 4.1.2 20080704 (Red Hat 4.1.2-48) 编写一些代码
我有一个使用 2 个静态库编译的可执行文件。他们每个人都使用一些全局(对于给定的库)数组变量(即在某些 .c 文件中我有一个
char var1[VAR_SIZE1];
,然后在我使用的 lib 的其他 .c 文件中extern char var1[VAR_SIZE1];
,以及与第二个 lib 相同的情况)。每个库都放置在它自己的可执行源目录的子目录中。我开始注意到一个库可以将其数据放在另一个库的内存中。为了发现发生了什么,我定义了一个指向第三个库中的一个变量的 void 指针(有问题的两个库都使用了库 3),为这个指针分配了一个 lib1 中的地址并查看了 lib2 中的地址。我现在看到的是:
char var1[1000]; /*please mind the length*/
extern void* ptr_to_var2;
printf("var1 addr is %p, var2 addr is %p\n", (void*)&var1, ptr_to_var2);
此代码产生
var1 地址为 0xa11b00,var2 地址为 0xa11e00
如您所见,var1 应该在地址 0xa11ee8 结束,而 var2 的头部位于 VAR1 内存内部。我究竟做错了什么?在静态库中使用全局变量是否有任何限制?我不能将这些变量定义为静态的,因为它们在每个库中的许多文件中都使用,并且使这些变量动态化是一项艰巨的工作(有几十个这样的变量)。
PS当然是初始化了ptr_to_var2。到底发生了什么
<lib3>
void* ptr_to_var2;
<lib2>
#include "hdr_with_my_struct_name_definition.h"
my_struct_name var2[5];
extern void* ptr_to_var2;
int func2(){
ptr_to_var2=(void*)&var2;
var2[0].fld1=12345;
return 1;
}
<lib 1>
#include "hdr_with_my_struct_name_definition.h"
char var1[1000];
extern void* ptr_to_var2;
int func1(){
my_struct_name *temp_var_2=(my_struct_name*)ptr_to_var2;
printf("%d", temp_var_2[0].fld1);
memset(var1, '\0', sizeof(var1);
printf("%d", temp_var_2[0].fld1);
return 1;
}
<binary>
main(){
func2();
func1();
return;
}
所有这些都返回 12345 0