传递给C函数的指针值不正确

我有一个错误,其中一个不正确的值作为参数传递给C程序中的函数。 它的工作方式是,我将一个指向typedef-ed数据结构的静态指针声明为全局变量。 有一个初始化函数,其中初始化了该变量。 此函数分配内存,初始化数据字段并返回指针。 像这样的东西:

static my_type *my_ptr; ... void init(void){ my_ptr = init_my_type(); } 

函数init_my_type非常简单:

 void *init_my_type(void){ my_type *x = malloc(sizeof(my_type); x->arg1 = 0; ... // more field initializations return x; } 

后来我使用my_ptr作为另一个函数的参数:

 void do_stuff(void){ func(my_ptr); } 

我遇到的问题是,当访问my_ptr指向的数据结构中的某些数据时,我会在funcmy_ptr

当我运行调试器时,当我在init_my_type上中断时,我得到一个漂亮的hex值:

 (gdb) finish Value returned is $26 (void *) 0x79b6c0 

稍后,在do_stuff函数中, my_ptr具有相同的hex值:

 (gdb) print my_ptr $26 = (my_type *) 0x79b6c0 

但是,当我打破func ,它获得的参数具有完全不同的值。

 Breakpoint 2, func(arg=0x1388) 

我到处都是打字指针,但是我没有看到它应该改变它们所指向的内存中的地址,对吧? 此外,函数funcinline声明的,但为什么会影响这个? 这对我来说似乎都是正确的 – 我完全有可能做一些我看不到的愚蠢行为。

这是简化代码的完整程序。 实际上,所有这些函数都不会被main调用,而是通过动态加载的辅助函数调用。 尽管如此,我还是看不到my_ptr指向的地址在传递给func时应该如何改变。

 #include "stdlib.h" #include "stdio.h" typedef struct _type{ int *i1; float *f1; }my_type; static my_type *my_ptr; void *init_my_type(void){ my_type *x = malloc(sizeof(my_type)); x->f1 = malloc(sizeof(float)); x->i1 = malloc(sizeof(int)); x->f1[0] = 123.456; x->i1[0] = 789; return x; } void init(void){ my_ptr = init_my_type(); } inline void func(void *arg){ my_type *x = (my_type *)arg; printf("%d %f\n", *x->i1, *x->f1); } void do_stuff(void){ func(my_ptr); } int main(void){ init(); do_stuff(); } 

以下不是问题的原因(并且不能,因为默认情况下静态全局变量初始化为零)。 虽然基本思想仍然相关:传递的指针是否真的与初始化相同。


一个疯狂的猜测:

 static my_type *my_ptr; 

难道这行是某些头文件的一部分吗? 因为在每个包含此标头的源文件中都有一个全局my_ptr

既然你写了这是一个非常大的项目,我假设你将代码分开并将其放入多个源文件中。 假设init函数与using函数位于不同的源文件中,那么这意味着它们正在访问不同的指针。 当一个init处理初始化时,一个func正在使用未初始化。

要检查这一点,您应该在两个函数中打印全局指针变量( &my_ptr )的地址。