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
简而言之:是的,内存已被释放。它可能没有被覆盖(因此它可能会工作一点),但很快就会被覆盖。
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
相同的范围内。