关于函数声明和返回值
问题如下:
char* f(void)
{
char buffer[50];
char*string=NULL;
gets(buffer);
string=(char*)malloc(strlen(buffer)+1);
return strcpy(string,buffer);
}
请问return返回的指针是不是所声明函数的内部变量?如果是的话,函数执行结束以后,里面动态分配的内存空间是否还存在?我记得本地变量在函数调用之后就应该自动释放了吧?
求指教
[解决办法]
不是内部变量,是一个副本而已。 你动态分配的内存如果不显式的free的话,那么就还在。函数的局部变量是自动释放了,但malloc的内存不属于函数的变量, 即使你将块内存的首地址赋值给一个局部变量也是如此,后来函数可能会将这个首地址返回,交给其它变量引用之,如果没人引用的话,它就会被系统回收,看起来有点像Java的GC。
[解决办法]
按你的理解来说明就是,返回的是函数内部变量的值,只是它的值。
也就是string这个变量的值。
储存这个值的内部变量在函数返回之后会从栈中释放。同时它的值会传给eax寄存器,所以即使从栈中释放,你也可以知道它的值。
这个值指向的是你在堆中申请的一段内存,它必须手动释放。
总结一下就是,这个值所指向的内存是不会被释放的,但储存这个值的变量会被释放。但释放也没关系,函数在最后将这个值返回了,所以不会丢失。
[解决办法]
string这个指针式局部变量,在函数退出后就消亡了,但它指向的内存还在,还没有消亡。
所以函数返回时,把string指针的值复制了一份作为了函数的放回值。
所以你程序中还是知道所申请的内存的位置的。
总的来说string指针消亡了 但它指向的内存没有消亡。