| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3953 人关注过本帖, 5 人收藏
标题:[原创]关于变量与内存分配的学习认识【原创】
只看楼主 加入收藏
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
结帖率:33.33%
收藏(5)
 问题点数:0 回复次数:10 
[原创]关于变量与内存分配的学习认识【原创】
*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: 中学者
*/ 时间: 2007-9-14 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------


变量和内存的问题,原来是自己理解,通过写小代码来验证,但是总感觉有什么地方不对,使我很混乱,所以今天就在网上看了一些文章,然后重新认识了这个问题。下面算是我的认识,如果有不对的地方,请指出,多多交流................ 我是新手!!!
C++中内存的分配:
1.栈:是用来存放像一般变量和函数参数等的一块内存。系统会在变量生存期结束时自动释放内存,即把内存从栈中弹出。
2.堆:用来存放动态变量,如指针。要通过设计者自己管理变量,自行进行创建和清理工作。(利用new和delete)
3.自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
4.全局/静态存储区:全局变量和静态变量被分配到同一块内存。
5.常量存储区:用来存储常量,即不能被修改的变量。
­
以上是内存分区的问题,下面是我理解的问题:
1.变量声明与定义:
声明只是告诉编译器有这么一个变量,而定义在声明的同时便进行内存分配。
//------1.cpp--------------
#include<iostream>
using namespace std;
extern int n;//声明变量n,只告诉有这么一个名字
void function(int a){....};//定义形参a,并分配内存
int main(){
int i; //定义变量i,并分配内存
return 0;
}
其中,对于函数function,形参a的生存期在函数体内,在函数结束工作后,a便被释放,从栈中弹出。(a所占的内存和内存地址现在没有变量使用了),来看下面的代码;
#include<iostream>
using namespace std;
int *p=NULL;
void fun(int a){ p=&a;}
int main(){
int n=10;
fun(n);
cout<<p;
return 0;
}
代码执行的结果是显示a的内存地址,然而在原来的我理解是a仍然占着这块内存区域,但是其实不是的,a早已被弹出栈,所以这块区域是空着的。之所以会这样,是因为指针p是全局的,p存放了a的地址,p的生存期没有结束,所以仍指向这块地址,所以会显示a的原来的内存地址。
­
由此,我就理解了传值返回和引用返回,为什么引用返回不能返回局部变量。第一,引用返回返回的是实际地址,即可用的。第二,如果返回局部变量,那么局部变量结束生存期被释放后,那块内存就空着了,没有变量用,所以不能操作........如果用传值返回返回局部变量却是可行的,因为传值返回在执行renturn 语句的时候要进行拷贝,把即将释放的局部变量的值拷贝到临时变量上。。
­
再来就是对于new和delete:
//-----------------------------2.cpp--------
#include<iostream>
using namespace std;
int main(){
int *p=new int(4);//p存储在栈中,动态分配得到的内存存在堆中,从而通过指针指向一个无名字的堆来进行相关的操作.......
................
...........
delete p;//释放p,p还是指向原处,因为p没被释放,被释放的是无名字的堆内存区块!!
return 0;
}
­
­
所以,我就理解认为,其实在编写代码时用到的变量,只不过是给底层的内存区域提供一个名字,然后间接地操作内存的内容...................
搜索更多相关主题的帖子: 内存 变量 学习 认识 
2007-09-14 22:38
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
如果文章里的代码的格式能够整理一下就更好了。。。。。。。



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/
2007-09-14 22:41
Adicelanton
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-9-15
收藏
得分:0 
楼主说到最根本的问题了!
现在中国的程序员有几个能拍着胸膛说他把程序的编译机制弄明白了的?!
如果要向这个方向发展,建议楼主把编译原理那本书,好好啃啃,想当初偶呀........

如果你对我报有仇恨,我将背负它,接受它! 我不知道风在向哪一个方向吹,我知道,你有你的,我有我的方向.
2007-09-15 20:04
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 

LS说的《编译原理》是美国的谁写的?我记不到名字了~


樱花大战,  有爱.
2007-09-17 21:11
earlyfly
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2005-12-2
收藏
得分:0 

理论不过关.很难写出好程序


2007-09-22 17:59
china25qd
Rank: 1
等 级:新手上路
帖 子:161
专家分:0
注 册:2007-9-6
收藏
得分:0 
不是6.0版吧?

抱膝怀天下 闲坐观四海
2007-09-22 20:24
china25qd
Rank: 1
等 级:新手上路
帖 子:161
专家分:0
注 册:2007-9-6
收藏
得分:0 
1.cpp(11) : fatal error C1010: unexpected end of file while looking for precompiled header directive

抱膝怀天下 闲坐观四海
2007-09-22 20:32
mbstorm
Rank: 1
等 级:新手上路
帖 子:166
专家分:0
注 册:2008-10-31
收藏
得分:0 
支持
2008-11-01 23:04
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
现在看到自己以前的文章......发现问题多多-  -

樱花大战,  有爱.
2008-11-02 00:09
冰烨
Rank: 1
来 自:不咔界
等 级:新手上路
威 望:1
帖 子:135
专家分:0
注 册:2007-10-30
收藏
得分:0 
那个,为什么new和malloc出的来不放在同一内在区?我原以为都是放在堆区的。。。

要么死去,要么奋斗!
2008-11-02 19:20
快速回复:[原创]关于变量与内存分配的学习认识【原创】
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013807 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved