在c中,自动变量在堆栈中分配内存,当包含自动变量的函数或代码块退出时,它们所占用的内存便被回收,他们的内容肯定会被下一个所调的函数覆盖.
解决这个问题的几个方案:
1.返回一个指向字符串长量的指针
char *fun()
{
return "For simple strings";
}
如果需要计算字符串的内容就无能为力了!
2.使用全局声明的数组
char *fun()
{
...
my_global[i]=...;
... return my_global;
}
这适用于自创建字符的情况,缺点在于任何人都可能在任何时候修改这个全局数组.下次调用也会影响覆盖此时数组的内容.
3.使用静态数组
char *fun()
{
static char buffer[256];
... return buffer;
}
可以防止任何人修改此数组,只有拥有指向该数组的指针的函数(通过参数传递)才能修改.但是,函数下一次调用将覆盖这个数组的内容.所以调用者必须在此前使用或备份数组内容.和全局数组一样,大型缓冲区如果闲置不用是非常浪费内存的.
4.显示分配一些内存,保存返回的值
char *fun()
{
char *s=malloc(20);
... return s;
}
这个方法具有静态数组的优点,而且在每次调用时都创建一个新的缓冲区,所以该函数以后的调用不会覆盖以前的返回值.缺点在于必须承担内存管理的责任.如果内存尚在使用就free或者"内存泄露"就会有bug
5.要求调用着分配内存来保存函数的返回值,为了提高安全性,应指定缓冲区的大小(像fgets()一样)
void fun(char *result,int size)
{
...
strmcpy(result,"That be in the data",size);
}
int main(void)
{
buffer=malloc(size);
fun(buffer,size);
...
free(buffer);
...
return 0;
}
可以在统一代码块中进行malloc和free操作