堆,栈内存分配 && 常量区

1题:

针对以下代码,


1

2

3

4

const char str1[] = "abc";

const char str2[] = "abc";

const char *p1 = "abc";

const char *p2 = "abc";

判断下列说法哪个是正确的()

正确答案: A   你的答案: F (错误)

str1和str2地址不同,P1和P2地址相同

str1和str2地址相同,P1和P2地址相同

str1和str2地址不同,P1和P2地址不同

str1和str2地址相同,P1和P2地址不同

4个地址都相同

4个地址都不同

解析:str1与str2:在栈中分配内存,指向不同地址。

p1,p2所指位置指向常量区。

关于栈,堆的内存分配:

1 静态分配发生在程序编译和连接时,动态分配则发生在程序调用执行时。

2 堆是动态分配的,没有静态分配的堆。

3 栈有两种分配方式,静态和动态。静态分配由编译器完成:如局部变量的分配。

4 动态分配由函数malloc分配,不过,栈的动态分配和堆不同,栈的由编译器进行释放,无需我们手工实现。

栈内存分配
—————
char*
AllocStrFromStack()
{
  char pstr[100];
  return pstr;
}
pstr在函数返回时被系统释放了。于是所返回的char*什么也没有

堆内存分配
—————
char*
AllocStrFromHeap(int len)
{
  char *pstr;

  if ( len <= 0 ) return NULL;
  return ( char* ) malloc( len );
}
pstr是从堆上分配内存,故,即使是程序退出,也不释放,故第二个函数返回的内存没有问题,可以使用,但一定要用free释放,否则 发生内存泄露。

时间: 2024-10-24 14:40:08

堆,栈内存分配 && 常量区的相关文章

c++中堆、栈内存分配

http://blog.sina.com.cn/s/blog_75b0e2ad01013afr.html http://blog.csdn.net/qingtingchen1987/article/details/7698415 http://blog.chinaunix.net/uid-11959329-id-2797040.html http://www.cnblogs.com/daocaoren/archive/2011/06/29/2092957.html [参见]http://blog

转!!Java虚拟机堆的内存分配和回收

Java内存分配和回收,主要就是指java堆的内存分配和回收.java堆一般分为2个大的区域,一块是新生代,一块是老年代.在新生代中又划分了3块区域,一块eden区域,两块surviver区域.一般称为from surviver和to surviver.这些区域的大小可以自己指定.比如:(-Xms20M 表示可用堆内存大小:-Xmx40M 表示最大堆内存,在堆内存大小不够时,会扩展到最大堆内存:-Xmn10M 表示新生代内存大小). 新生代中的对象会在eden区域分配,然后eden区域的内存不够

11,一道关于栈内存分配的题目

今天看到一道关于栈内存分配的题目,很是精悍,索性记录下来. 一.题目 假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少? #include <stdio.h> int main(){ long long a = 1, b = 2, c = 3; printf("%d %d %d\n", a, b, c); return 0; } 二.解答 输出1 2 3?想想也没这么简单把.如题目所说,32位系统,longlong占8字节,int占4字节

剖析程序中的栈与堆的内存分配

在计算机系统中,运行的应用程序的数据都保存在内存中,不同类型的数据所保存在的区域不同,应用程序中总共有五个内存区域: (1).栈区[stack]:由编译器自动分配并释放,一般存放函数的参数值,局部变量等 (2).堆区[heap]:由程序员分配和释放内存,如果程序员不释放,程序结束时,可能会由操作系统回收 (3).全局区[静态区][static]:全局变量和静态变量的存储是放在一起的,而该区又分为两种情况,一种是已初始化的,另一种是未初始化的,初始化的全局变量和静态变量存放在一块区域,未初始化的全

Java中堆内存与栈内存分配浅析

Java把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用. 堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理.在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数

【操作系统】堆和内存分配

光有栈对于面向对象过程的程序设计远远不够,因为栈上的数据在函数返回的时候就会被释放带哦,所以无法将数据传递至函数外部.而全局变量没有办法动态地产生,只能在编译的时候定义,有很多情况下缺乏表现力.在这种情况下,堆(Heap)是唯一的选择 堆是一块巨大的内存空间,常常占据整个虚拟内存空间的绝大部分.在这片空间里,程序可以请求一块连续内存,并自由地使用,这块内存在程序主动放弃之前都会一直保持有效.下面是一个申请堆空间最简单的例子. 1 int main() 2 { 3 char * p= (char*

19、java内存分配 常量池详解

在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如String及数组)的常量值还,还包含一些以文本形式出现的符号引用,比如: 类和接口的全限定名: 字段的名称和描述符: 方法和名称和描述符. 在C语言中,如果一个程序要调用其它库中的函数,在连接时,该函数在库中的位置(即相对于库文件开头的偏移量)会被写在程序中,在运行时,直接去这个地址调用函数: 而在Jav

C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

      栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样,用户栈在程序执行期间可以动态地扩展和收缩. 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收.堆可以动态地扩展和收缩. 自由存储区,就是那些由 

内存分配及堆与栈的区别

1.内存分配方式 内存分配方式有三种: 1.从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. 2.从堆栈上分配.函数内的局部变量的存储单元,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 3.从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的生存期由程序员决定