我有一个错误,其中一个不正确的值作为参数传递给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);
}
我遇到的问题是,当func
指向的数据结构中的某些数据被访问时,我会在my_ptr
的内容中出错。
当我运行调试器时,当我打破init_my_type
时,我得到一个漂亮的十六进制值:
(gdb) finish
Value returned is $26 (void *) 0x79b6c0
稍后,在do_stuff
函数内,my_ptr
具有相同的十六进制值:
(gdb) print my_ptr
$26 = (my_type *) 0x79b6c0
但是,当我打破func
时,它获得的参数具有完全不同的值。
Breakpoint 2, func(arg=0x1388)
我到处都是打字指针,但是我没有看到它应该改变他们指向的内存中的地址,对吧?此外,函数func
被声明为inline
,但为什么会影响这个?这对我来说似乎都是正确的 - 我完全有可能做一些我看不到的蠢事。
这是简化代码的完整程序。实际上,所有这些函数都不会被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();
}
答案 0 :(得分:0)
以下不是问题的原因(并且不能,因为默认情况下静态全局变量初始化为零)。虽然基本思想仍然相关:传递的指针是否真的与初始化相同。
疯狂猜测:
static my_type *my_ptr;
这行是否是某些头文件的一部分?因为每个源文件中都有一个包含此标题的全局my_ptr
。
由于您写道这是一个非常大的项目,我假设您将代码分开并将其放入多个源文件中。假设init函数与using函数位于不同的源文件中,那么这意味着它们将访问不同的指针。虽然init
处理的内容已初始化,但func
正在使用的内容未初始化。
要检查这一点,您应该在两个函数中打印全局指针变量(&my_ptr
)的地址。