所以我有一个共享库的代码 testlib.c :
#include <stdio.h>
int **z;
void f(int *x)
{
z = &x;
printf("TESTLIB.C: z = %p, *z = %p, **z = %d\n", z, *z, **z);
}
void f2(void)
{
printf("TESTLIB.C: z = %p, *z = %p, **z = %d\n", z, *z, **z);
}
testlib.h :
void f(int *);
void f2(void);
应用程序文件 test.c :
#include <stdio.h>
#include "testlib.h"
int main()
{
int y = 1;
int *x = &y;
printf("TEST.C: &x = %p, x = %p\n", (void *)&x, (void *)x);
f(x);
f2();
return 0;
}
我将共享库testlib.c编译为
gcc -shared -fPIC testlib.c -o libtest.so
和test.c as
gcc test.c -o test -L. -ltest
LD_LIBRARY_PATH=.
现在我执行./test
的输出是
TEST.C: &x = 0x7ffcd99e9f40, x = 0x7ffcd99e9f3c
TESTLIB.C: z = 0x7ffcd99e9f18, *z = 0x7ffcd99e9f3c, **z = 1
TESTLIB.C: z = 0x7ffcd99e9f18, *z = 0x7f71cb8af168, **z = 0
TEST.C: &x = 0x7ffcd99e9f40, x = 0x7ffcd99e9f3c, *x = 1
为什么第二行z
的值不等于第一行的&x
值?根据我的理解,共享库被加载到与加载它的进程相同的地址空间中?
此外,为什么*z
会在调用f2()
时发生变化?在调用z
期间,有没有办法保留f()
中存储的值?