C 返回函数内部释放的指针

C 返回函数内部释放的指针,c,pointers,gcc,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
可能会自动释放,从而释放
*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是否在该函数返回后指向释放的内存

concatDest=buff;
}
最后一条语句不会改变程序的可观察行为,并且很可能会被任何合适的编译器优化掉

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

concatDest=buff;
这不是一个好主意,因为当函数返回时,它的所有
局部变量都会被销毁
。因此,如果您试图访问存储在
buff
中的数据(此函数之外),该数据的地址已分配给
concatDest
,则您将遇到故障分段

  • 获取长度参数
  • 将concatDest传递给vsnprintf
但你只剩下snprintf了

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


简而言之:是的,内存已被释放。它可能没有被覆盖(因此它可能会工作一点),但很快就会被覆盖。

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

现在您可能想到的是,如果您像这样调用此函数:

strCat1000(string, "some format", some other args);
但是在这种情况下,
string
不受函数中对
concatDest
的更改的影响——参数是通过C中的值传递的。当然,这意味着函数没有效果 它会打印到一个临时缓冲区,然后销毁该缓冲区,但对
string
*string
在过程中。

创建者应为销毁者。考虑“<代码>最低处< /代码>是否在堆栈上?!Oops——听起来有点宗教色彩——并不意味着就是这样——这段代码应该做什么?它应该连接几个字符串并将它们放在concatDest中。如果我想将结果存储在我连接的字符串中,我想使它仍然有效。。。此函数是一个灾难,最好将其声明为
char*strCat1000(char*format,…)
,并且不要在内部执行任何释放操作。@AppFzx如果要修改原始指针,请执行“是”,但不能传递
缓冲区
buffer
对象具有自动存储持续时间,并且在函数返回时将被销毁。将其调用为类似于strCat1000(&logText,“记录此%s,%s,%s”,“stuff1”,“stuff2”,“stuff3”)
?@AppFzx yes,但再次返回
buff
是错误的,因为它将被销毁。而且你的
free
在你的函数里面是糟糕的设计,最好是
free
在与你
malloc
相同的范围内。