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.csdn.net/wudaijun/article/details/8135205#include<iostream>
using namespace std;
int main()
{
    char p[] ="123456";
    // char s[10];     //  正常复制: 123456  -- 123456
    char s[4];     //  栈溢出(目标栈空间不够大), output: 56  -- 123456
    char *ptr = p + 3;
    strcpy(s, p);
    cout<< p << "  --  " << s << "  ---  " << ptr << endl;
    return 0;
}

// 栈 内存分配方式 (地址:高(左)->低(右); 数据写入方向:低(右)->高(左))
// ‘/0‘ ‘6‘ ‘5‘ ‘4‘ ‘3‘ ‘2‘ ‘1‘(p) ‘‘ ‘‘ ‘‘ ‘‘(s)     // char p[] ="123456";//char s[4];
// ‘/0‘ ‘6‘ ‘5‘ ‘4‘(ptr) ‘/0‘ ‘6‘ ‘5‘(p) ‘4‘ ‘3‘ ‘2‘ ‘1‘(s)            //strcpy(s, p);
// output : 56  --  123456  ---  456
// 解析:在这里我们可以知道p=s+4;  然后我们对s进行写入"123456"  s所在的四个字节不够用  所以"56"(包括后面的/0)均被写入了p地址 因此输出p将输出56
时间: 2024-08-24 18:26:59

c++中堆、栈内存分配的相关文章

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

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和st

JAVA中堆栈和内存分配

(一).栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中.)3. 堆:存放所有new出来的对象.4. 静态域(属于方法区) :存放静态成员(static定义的)5. 常量池 (属于方法区):存放字符串常量和基本类型常量(public static final).6. 非RAM存储:硬盘等永久存储空间这里我们主要关心栈

浅析栈区和堆区内存分配的区别

以下是对栈区和堆区内存分配的区别进行了详细的分析介绍,需要的朋友可以过来参考下 一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上图可知,程序占用的内存被分了以下几部分. 1.栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分

JAVA中堆栈和内存分配原理

1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中.)3. 堆:存放所有new出来的对象.4. 静态域:存放静态成员(static定义的)5. 常量池:存放字符串常量和基本类型常量(public static final).6. 非RAM存储:硬盘等永久存储空间这里我们主要关心栈,堆和常量池,对于 栈和常量池中的对

JAVA中堆栈和内存分配详解(摘抄)

在Java中,有六个不同的地方可以存储数据: 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中.) 3. 堆:存放所有new出来的对象. 4. 静态域:存放静态成员(static定义的) 5. 常量池:存放字符串常量和基本类型常量(publicstatic final). 6. 非RAM存储:硬盘等永久存储空间 这里我们主

浅析栈区和堆区内存分配的区别(转)

以下是对栈区和堆区内存分配的区别进行了详细的分析介绍,需要的朋友可以过来参考下 一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上图可知,程序占用的内存被分了以下几部分. 1.栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分

Java 中数组的内存分配

Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是存储同一种数据类型多个元素的容器. 数组既可以存储基本数据类型,也可以存储引用数据类型. 格式:数据类型[] 数组名 ; int[] arr; 数组的初始化方式: 动态初始化 : 初始化时只指定数组长度,由系统为数组分配初始值. 格式:数据类型[] 数组名 = new 数据类型[数组长度]; 数组长

转!!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字节