传递给函数的双重间接和结构

时间:2010-03-30 21:14:37

标签: c data-structures function pointers

我很好奇为什么这段代码有效:

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);
}

2 个答案:

答案 0 :(得分:3)

你是对的,将指针传递给堆栈上分配的东西(因此在函数返回时消失了)。

将指针传递给堆分配的变量很好。

“它有效”是一种幻觉。您将在第一个代码示例中返回指向堆栈分配变量的指针。

指针将指向垃圾 - 尝试取消引用它......

答案 1 :(得分:3)

第一个版本工作只是运气不好。在test_func返回之后但在调用printf之前尝试随机调用其他内容。

第二个版本是正确的。当然,你没有释放堆内存,但是在程序结束时是否重要是一个有争议的问题。