注意下面的代码,本意是想返回一个字符串, 但当它返回调用者的时候, 返回串却是垃圾信息。 :
char *itoa(int n)一种解决方案是把返回缓冲区声明为
{
char retbuf[20]; /* 错!redbuf为自动变量*/
sprintf(retbuf, "%d", n);
return retbuf; /* 错!自动变量此时将销毁*/
}
static char retbuf[20];
本方案并非完美, 尤其是有问题的函数可能会递归调用, 或者会同时使用到它的多个返回值时。
那么返回字符串或其它集合的争取方法是什么呢?
返回指针必须是:
1.静态分配的缓冲区;
2.调用者传入的缓冲区,
3.用 malloc() 获得的内存,
但不能是局部 (自动) 数组。
注意:局部变量在函数返回时就会释放, 但是在指针变量这个问题上, 这表示指针被释放, 而 不是它所指向的对象。用 malloc() 分配的内存直到你明确释放它之前都会保留在那里。 一般地, 对于每一个 malloc() 都必须有个对应的 free() 调用。