【问题标题】:Double indirection and structures passed into a function传递给函数的双重间接和结构
【发布时间】:2010-03-30 21:14:36
【问题描述】:

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

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

【问题讨论】:

    标签: c data-structures function pointers


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你是对的,传递一个指向在堆栈上分配的东西的指针(因此当函数返回时消失,是错误的)。

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

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

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

      【讨论】:

      • “指针将指向垃圾——尝试取消引用它..”——他确实尝试取消引用它。不幸的是,它打印的垃圾看起来就像他可能期望的值,如果它不是垃圾的话。这是垃圾的问题之一 - 有时它看起来非常好。
      • 嗯...同意了。这纯属巧合。我想这就是让 OP 感到困惑的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2012-05-09
      • 2021-04-04
      相关资源
      最近更新 更多