我很好奇为什么这段代码有效:
typedef struct test_struct {
int id;
} test_struct;
void test_func(test_struct ** my_struct)
{
test_struct my_test_struct;
my_test_struct.id=267;
*my_struct = &my_test_struct;
}
int main ()
{
test_struct * main_struct;
test_func(&main_struct);
printf("%d\n",main_struct->id);
}
这样可行,但是指向一个函数局部变量的内存地址是一个很大的禁忌,对吗?
但是如果我使用结构指针和malloc,那将是正确的方法,对吗?
void test_func(test_struct ** my_struct)
{
test_struct *my_test_struct;
my_test_struct = malloc(sizeof(test_struct));
my_test_struct->id=267;
*my_struct = my_test_struct;
}
int main ()
{
test_struct * main_struct;
test_func(&main_struct);
printf("%d\n",main_struct->id);
}
答案 0 :(得分:3)
你是对的,将指针传递给堆栈上分配的东西(因此在函数返回时消失了)。
将指针传递给堆分配的变量很好。
“它有效”是一种幻觉。您将在第一个代码示例中返回指向堆栈分配变量的指针。
指针将指向垃圾 - 尝试取消引用它......
答案 1 :(得分:3)
第一个版本工作只是运气不好。在test_func返回之后但在调用printf之前尝试随机调用其他内容。
第二个版本是正确的。当然,你没有释放堆内存,但是在程序结束时是否重要是一个有争议的问题。