返回指针在函数内释放

时间:2013-10-12 17:42:22

标签: c pointers gcc

这似乎似乎运行有任何问题,但我在想它何时返回,buff可能会自动释放,而这将自由*string并导致void strCat1000(char *concatDest, char *format, ...) { char buff[1000]; va_list arg_ptr; va_start(arg_ptr, format); vsnprintf(buff, sizeof(buff), format, arg_ptr); va_end(arg_ptr); free(concatDest); concatDest=buff; } 我下次分配时会出现问题并且内存被覆盖(或者更糟,等等)。我不想通过反复试验来测试,因为到目前为止我可能只是在测试中幸运。我做错了吗?

{{1}}

更简洁的是,concatDest指向此函数返回后释放的内存?

4 个答案:

答案 0 :(得分:1)

concatDest=buff;
}

这最后一个语句不会改变程序的可观察行为,很可能只是由任何体面的编译器进行优化。

记住C按值传递参数,而不是修改原始指针而是修改函数中的本地副本。

答案 1 :(得分:0)

concatDest=buff;

不是一个好主意,因为当函数返回时,它的所有local variables are destroyed。因此,如果您尝试访问存储在buff中的地址已分配给concatDest的数据(此功能之外),则会出现Segmentationf fault

答案 2 :(得分:0)

你应该是,

  • 采用长度参数
  • 将concatDest传递给vsnprintf

..但是你刚刚离开了snprintf

buff被分配在堆栈上,并且将concatDest分配给它的地址将不起作用,因为一旦弹出堆栈(返回时),它指向的内存就会消失。

更简洁:是的,内存已被释放。它可能没有被覆盖(所以它可能看起来有点工作)但很快就会被覆盖。

答案 3 :(得分:0)

buff是一个局部变量,因此当函数返回时它是无效的(弹出堆栈)。但那么concatDest也是如此,所以没有问题 - 你只有一个局部变量指向局部变量并且两者同时消失。

现在您可能会想到的是,如果您将此功能称为:

strCat1000(string, "some format", some other args);

但在这种情况下,string不受函数中concatDest更改的影响 - 参数通过C中的值传递。当然,这意味着您的函数没有效果 根本 - 它打印到临时缓冲区,然后销毁该缓冲区,但它没有影响 string。