如何在void *中存储int指针?

时间:2014-11-15 16:49:29

标签: c pointers casting

情景如下:

typedef struct a {
    void* val;
} a_t;

void fun (void** val)
{
    int a = 5;
    *val = &a;
}

a_t *x;
x = malloc (sizeof *x);
fun (&x->val);

printf ("%d", *((int*)(x->val)));

我希望,x->val属于void*类型(在printf()中使用时)。我怎样才能找回存储在其中的int值?

2 个答案:

答案 0 :(得分:2)

问题出在fun 如果你期望STDOUT上的5比这个函数看起来像这样:

void fun (void** val)
{
    int *a = malloc(sizeof(int));
    *a = 5;
    *val = a;
}

您不应该返回指向自动变量的指针,因为它在堆栈上分配并在函数执行后延迟。要了解更多信息,请查看this answer

答案 1 :(得分:0)

问题是指针设置为局部变量。因此,当函数终止时,它的内存将被解除分配,因此指针将被设置为垃圾(它将成为汉斯建议的dangling pointer)。

所以,如果你很幸运,printf()会打印垃圾,否则会打印5。


快速解决方法是将static关键字添加到int a,这样可以在函数终止时取消分配。

void fun(void** val) {
  static int a = 5;
  *val = &a;
}

然而,这不是很灵活,因为fun()的所有实例都具有相同的变量a

或者您可以像这样动态分配内存:

void fun(void** val) {
  int *a = malloc(sizeof(int));
  *a = 5;
  *val = a;
}

别忘了像这样释放你的记忆:

  a_t *x;
  x = malloc (sizeof *x);
  fun (&x->val);

  printf ("%d", *((int*)(x->val)));
  free(x->val);  // this has to go first
  free(x);
  return 0;
}