0

似乎没有任何问题运行,但我在想当它返回时,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;
}

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

4

4 回答 4

1
concatDest=buff;
}

最后一条语句不会改变程序的可观察行为,并且很可能会被任何体面的编译器优化掉。

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

于 2013-10-12T17:43:55.943 回答
0

你应该,

  • 取一个长度参数
  • 将 concatDest 传递给 vsnprintf

..但是你只剩下 snprintf

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

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

于 2013-10-12T17:46:27.193 回答
0

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

现在您可能会想到的是,如果您将这个函数称为:

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

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

于 2013-10-12T17:53:02.877 回答
0
concatDest=buff;

这不是一个好主意,因为当函数返回时,它的所有local variables are destroyed. 因此,如果您尝试访问存储在buff其地址分配给的数据(在此函数之外) concatDest,您将出现 Segmentationf 错误

于 2013-10-12T17:44:51.797 回答