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

来源:互联网 发布:淘宝旺旺号是会员名吗 编辑:程序博客网 时间:2024/05/16 11:26

在谈述函数调用和返回值问题之前,先来看看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;}
运行结果:


结论:

当指针作为参数进行传递时传递的也只是一个值,只不过该值只一个地址,因此对于形参的改变并不影响实参。



原创粉丝点击