求职遭遇的问题(C#和C++)。(3)

C++中的变量存储空间:数据区,代码区,文字常量区,堆,栈

C#的反射原理。

 

 

C++中的变量存储空间:数据区,代码区,文字常量区,堆,栈

相关链接:http://www.cppblog.com/oosky/archive/2006/01/21/2958.html

1,数据区:存储全局变量和静态变量的地方,由编译器编译前分配。

2,代码区:存储代码的空间,没有什么好解释的。

3,文字常量区:存储文字常量,编译器编译前分配,我认为跟数据区一个性质。

char *p="abcdefg";

"abcdefg"就存储在文字常量区。

4,堆。堆就是动态分配的内存区,比如用new 关键字,malloc函数分配的。

 p=(char *)malloc(10); 

p=new char[10];

堆非常重要,即是程序能量的源泉,也是麻烦的开始:

(1)堆是不在程序的“预算”之内的,向操作系统申请,操作系统还剩下多少内存,就能分配多少。

(2)堆是程序不会自动回收的。C++之所以麻烦,就是要自己回收用new,malloc分配的内存,经常我们弄不干净。

5,栈。去掉前面说的,剩下的就统统是栈了。下面的定义,只要不是全局变量,就都是栈

int i;

char c;

int i[10];

char p[]="abcdefg";

 

6.栈和文字常量区

char *p="abcdefg";//"abcdefg"在文字常量区

char p[]="abcdefg";//"abcdefg"在栈

 

7,堆和栈。

1),不管存储的数据的实际空间是在堆还是栈,指针总是存储在栈(只要不是静态或全局变量)。

int i[100]; //分配的存储空间在栈区,指针i在栈区

int *i=new int[100];//分配的存储空间在堆区,指针i在栈区

2),栈是程序预先分配的,有固定大小,int i[10000000000]应该是分配不到,但是用int i[]=new int[1000000000]说不定就可以。

3),栈是程序自动管理的,这句废话的真实意思是,当离开函数时,在这个函数里创建的空间就要被回收。

char *fun()

{

char p[]="abcde";

return p;

}

这个函数返回的空间指向的是乱码.为什么?“abcde”存储在栈区,对不起,函数结束,回收。

那好,我们可以用文字常量区——char *p="abcde"问题是,文字常量区一直都不释放,有点浪费,看情况。或者用堆区——

char *p=new char[5]{'a','b','c','d','e'},很好,这个空间会一直存在,从一个函数到另一个函数,知道程序结束它还存在,除非你记得释放这个存储空间——delete p;

 

PS:

  1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;
  4. char*  fun3()
  5. {
  6.     char *p="cdef";
  7.     return p;
  8. }
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11.     cout<<fun3();
  12.     int i;
  13.     cin>>i;
  14. }

输出结果:"cdef"

这段代码说明一个简单的事实:即使是在子函数中,通过这种方法定义的字符串,一样是存储在字符串常量区

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值