读书人

【C++函数调用小疑点】

发布时间: 2012-02-20 21:18:25 作者: rapoo

【C++函数调用小问题】
不是说调用函数之后,,函数之内除返回值的东西会消失吗?

那么调用生成列表的函数之后,只返回了头地址的值,,列表怎么还存在?

我菜鸟一个,,谢谢解答;


struct Jonse
{
int code;
Jonse *next;
}


Jonse * Creat( int n )
{
,,,,,,
}

[解决办法]
这个问题描述起来比较麻烦,主要是变量的存储位置不一样,会导致表现出来的结果也不一样。
一般来说 变量可以存储在 栈 上,也可以存储在 堆 上。

存储在栈上的变量会受到作用域的影响,当超出了该变量的作用域(静态变量除外),该变量就会被弹出堆栈,它所占用的内存也会被释放掉。
存储在 堆 上的变量会一直存在于内存之中,除非你显式地去释放它。

如果你需要把某个变量/对象存储在堆上,那么你就需要用 malloc 函数 或者 new 操作符,否则该变量就应该是存放在 栈 上。

举例如下
我有两个函数,这两个函数都是返回一个std::string类型的指针,但其中一个函数在调用时,会产生断错误。原因是它返回了一个堆栈上的地址,这个地址在该函数被调用之后便不复存在了!

C/C++ code
#include <iostream>//危险:获取栈上指针std::string* getStackPointer(){    std::string str(std::string("hello getStackInteger"));    return &str;}//合法:获取堆上的指针std::string* getHeapPointer(){    std::string* pstr = new std::string("hello getHeapPointer");    return pstr;}int main(){    std::string* pStr = getHeapPointer();    std::cout << "The value of string is: \n"<<*pStr<< std::endl;    delete [] pStr;    //注意:此处会出现断错误    pStr = getStackPointer();    std::cout << "The value of string is: \n"<<*pStr<< std::endl;    return 0;} 

读书人网 >C++

热点推荐