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

时间:2015-08-07 17:21:58

标签: c pointers inline type-punning

我有一个错误,其中一个不正确的值作为参数传递给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();


}

1 个答案:

答案 0 :(得分:0)

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

疯狂猜测:

static my_type *my_ptr;

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

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

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