您的位置:首页 > 编程语言 > C语言/C++

C++中内存分配、函数调用和返回值问题

2013-05-02 20:54 204 查看
在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题



以下是各个区的作用:

(1)代码区:存放程序代码;

(2)数据区

   a.静态数据区: 在编译器进行编译的时候就为该变量分配的内存,存放在这个区的数据在程序全部执行结束后系统自动释放,生命周期贯穿于整个程序执行过程。

   b.动态数据区:包括堆区和栈区

    堆区:这部分存储空间完全由程序员自己负责管理,它的分配和释放都由程序员自己负责。这个区是唯一一个可以由程序员自己决定变量生存期的区间。可以用malloc,new申请对内存,并通过free和delete释放空间。如果程序员自己在堆区申请了空间,又忘记将这片内存释放掉,就会造成内存泄露的问题,导致后面一直无法访问这片存储区域。

    栈区:存放函数的形式参数和局部变量,由编译器分配和自动释放,函数执行完后,局部变量和形参占用的空间会自动被释放。效率比较高,但是分配的容量很有限。

注意:1)全局变量以及静态变量存放在静态数据区;

    2)注意常量的存放区域,通常情况下,常量存放在程序区(程序区是只读的,因此任何修改常量的行为都是非法的),而不是数据区。有的系统,也将部分常量分配到静态数据区,比如字符串常量(有的系统也将其分配在程序区)。但是要记住一点,常量所在的内存空间都是受系统保护的,不能修改。对常量空间的修改将造成访问内存出错,一般系统都会提示。常量的生命周期一直到程序执行结束为止。

在弄懂内存分配的问题过后,来看看函数调用的过程:

执行某个函数时,如果有参数,则在栈上为形式参数分配空间(如果是引用类型的参数则类外),继续进入到函数体内部,如果遇到变量,则按情况为变量在不同的存储区域分配空间(如果是static类型的变量,则是在进行编译的过程中已经就分配了空间),函数内的语句执行完后,如果函数没有返回值,则直接返回调用该函数的地方(即执行远点),如果存在返回值,则先将返回值进行拷贝传回,再返回执行远点,函数全部执行完毕后,进行退栈操作,将刚才函数内部在栈上申请的内存空间释放掉。
理解一个指针传参的例子:

#include<iostream>
using namespace std;

void test(int *p)
{
int b=2;
p=&b;
cout<<"Test Function call ing   **********"<<endl;
cout<<"&p == "<<&p<<endl;
cout<<"p  == "<<p<<endl<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
int a = 10;
int *p = &a;

cout<<"Before test Function call"<<endl;
cout<<"&p == "<<&p<<endl;
cout<<"p  == "<<p<<endl<<endl;

test(p);

cout<<"After test Function call"<<endl;
cout<<"&p == "<<&p<<endl;
cout<<"p  == "<<p<<endl<<endl;
return 0;
}
运行结果:



结论:

当指针作为参数进行传递时传递的也只是一个值,只不过该值只一个地址,因此对于形参的改变并不影响实参。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: