情景如下:
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值?
答案 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;
}