gpt4 book ai didi

c - 在静态库中使用全局变量

转载 作者:行者123 更新时间:2023-12-02 03:55:47 24 4
gpt4 key购买 nike

我正在用纯 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的情况相同)。每个库都放在它自己的可执行源目录的子目录中。我开始注意到一个库可以将其数据放在另一个库的内存中。为了发现发生了什么,我在第三个库中定义了一个指向其中一个变量的空指针(有问题的两个库都使用了 lib 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 内存中。我究竟做错了什么?在静态库中使用全局变量有什么限制吗?我不能将这些变量定义为静态变量,因为它们在每个库中的许多文件中都被使用,并且使这些变量成为动态变量是一项艰巨的工作(有几十个这样的变量)。

附言当然,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;
}

所有这些都返回123450

最佳答案

printf("var1 addr is %p, var2 addr is %p\n", (void*)&var1, ptr_to_var2);

在这里,您试图打印 ptr_to_var2 的值,而不是它的实际地址。由于此变量尚未初始化,因此它的值是随机的,可以是任何值。

#include<stdio.h>

char v[1000];

void *p1;

int main() {

printf ("var1 %p, var2 %p &var2 %p\n", &v[0], p1, &p1);

return 0;
}

给出:

var1 0x601040, var2 (nil)  &var2 0x601428

关于c - 在静态库中使用全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12706039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com