这似乎似乎运行有任何问题,但我在想它何时返回,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指向此函数返回后释放的内存?
答案 0 :(得分:1)
concatDest=buff;
}
这最后一个语句不会改变程序的可观察行为,很可能只是由任何体面的编译器进行优化。
记住C按值传递参数,而不是修改原始指针而是修改函数中的本地副本。
答案 1 :(得分:0)
concatDest=buff;
不是一个好主意,因为当函数返回时,它的所有local variables are destroyed
。因此,如果您尝试访问存储在buff
中的地址已分配给concatDest
的数据(此功能之外),则会出现Segmentationf fault
答案 2 :(得分:0)
你应该是,
..但是你刚刚离开了snprintf
buff被分配在堆栈上,并且将concatDest分配给它的地址将不起作用,因为一旦弹出堆栈(返回时),它指向的内存就会消失。
更简洁:是的,内存已被释放。它可能没有被覆盖(所以它可能看起来有点工作)但很快就会被覆盖。
答案 3 :(得分:0)
buff
是一个局部变量,因此当函数返回时它是无效的(弹出堆栈)。但那么concatDest
也是如此,所以没有问题 - 你只有一个局部变量指向局部变量并且两者同时消失。
现在您可能会想到的是,如果您将此功能称为:
strCat1000(string, "some format", some other args);
但在这种情况下,string
不受函数中concatDest
更改的影响 - 参数通过C中的值传递。当然,这意味着您的函数没有效果
根本 - 它打印到临时缓冲区,然后销毁该缓冲区,但它没有影响