内存管理-堆、栈的地址高低? 栈的增长方向?

问题描述

堆、栈的地址高低? 栈的增长方向?

程序员的自我修养》说栈的地址比堆高,栈是向下增长的,堆是向上增长的。

#include
#include
int main()
{
using namespace std;
double a0[4] = {1.2 2.4 3.6 4.8};
double a1[4] = {1.2 2.4 3.6 4.8};
vector a2(4);
vector a3(4);
a2[0] = 1.0/3.0;
a2[1] = 1.0/5.0;
a2[2] = 1.0/7.0;
a2[3] = 1.0/9.0;
a3[0] = 1.0/3.0;
a3[1] = 1.0/5.0;
a3[2] = 1.0/7.0;
a3[3] = 1.0/9.0;
cout << ""a0[2]: "" << a0[2] << "" at "" << &a0[2] << endl;
cout << ""a1[2]: "" << a1[2] << "" at "" << &a1[2] << endl;
cout << ""a1[3]: "" << a1[3] << "" at "" << &a1[3] << endl;
cout << ""a2[2]: "" << a2[2] << "" at "" << &a2[2] << endl;
cout << ""a2[3]: "" << a2[3] << "" at "" << &a2[3] << endl;
cout << ""a3[2]: "" << a3[2] << "" at "" << &a3[2] << endl;
cout << ""a3[3]: "" << a3[3] << "" at "" << &a3[3] << endl;

return 0;
}

运行结果不是这样的,
有问题如下
堆的地址怎么比栈高?(a2[2]比a1[2]高)
数组里怎么a1[3]比a1[2]高?

解决方案

栈的增长方向
栈的增长方向
栈的增长方向

解决方案二:
地址都是由低到高,但是栈中存放的地址是由高到低。所以是反向的。

解决方案三:
只说总的栈地址高,但栈地址之间是向下的,堆是向高扩展

解决方案四:
char p= malloc (10);
printf(""%d""(char
)&p-p);
free(p);

堆 内存 ,是用来动态分配的内存
栈内存,用于参数传递,函数返回地址暂存,函数参数,自动变量的内存,某些临时变量,以及运行中保存的数据的内存。

解决方案五:
char p= (char)malloc (10);
printf(""p = %p&p = %pp-&p=%p
""p&pp-(char*)&p);
free(p);

时间: 2024-10-31 02:49:17

内存管理-堆、栈的地址高低? 栈的增长方向?的相关文章

linux内存管理---物理地址、线性地址、虚拟地址、逻辑地址之间的转换

linux内存管理---虚拟地址.逻辑地址.线性地址.物理地址的区别(一) 这篇文章中介绍了四个名词的概念,下面针对四个地址的转换进行分析 CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步(如下图): 首先,将给定一个逻辑地址(其实是段内偏移量,这个一定要理解!!!),CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址, 其次,再利用其页式内存管理单元,转换为最终物理地址.        这样做两次转换,的确是非常麻烦而且没有必要的,因为直接可以把线性地址抽像给进程.

理解C语言——从小菜到大神的晋级之路(12)——动态内存管理

      本节视频链接:点击这里         在前面的内容中,我们通常使用数组来利用一段连续的内存空间来保存数据.我们前面用到的数组基本保存在栈内存中,其内存空间由系统自动分配和释放,使用非常方便,也不用担心内存管理的问题.但是在栈中分配的数组存在一个严重的问题,就是它的长度必须在建立时明确指定,且无法再运行时修改.为了防止运行时出现内存空间不够的问题,在编程时就必须定义一个非常大的数组来容纳理论上可能的最多个的元素,这样就会导致内存利用率底下,因为如果元素个数较少时大部分的内存空间都被浪

java内存管理(堆、栈、方法区)

java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉到的内存问题,并且在内存问题出现的时候,也不能很快的定位并解决.因此,了解并掌握Java的内存管理是我们必须要做的是事,也只有这样才能写出更好的程序,更好地优化程序的性能. 概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁

嵌入式Linux与物联网软件开发——C语言内核深度解析》一1.7 内存管理之栈(stack)

1.7 内存管理之栈(stack) 1.7.1 什么是栈 我们常常听人说堆栈,但大家一定要明确区分:堆就是堆,栈就是栈.我们平常说的堆栈一般是指栈.那栈的本质是什么?栈是一种数据结构,C语言中使用栈来保存局部变量(注意,下文中不强调的情况下,局部变量均指非静态局部变量).栈是被发明出来管理内存的,是一种维护内存的机制,这就是栈的本质. 1.7.2 栈管理内存的特点(小内存.自动化) 栈的特点是入口即出口,只有一个口,另一个口是堵死的.所以先进去的后出来,也就是先进后出,而与栈特点相对的就是先进先

Linux堆内存管理深入分析(上)

Linux堆内存管理深入分析 (上半部) 作者:走位@阿里聚安全 0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢出的漏洞利用资料就很少了.鄙人以为主要是堆溢出漏洞的门槛较高,需要先吃透相应操作系统的堆内存管理机制,而这部分内容一直是一个难点.因此本系列文章主要从Linux系统堆内存管理机制出发,逐步介绍诸如基本堆溢出漏洞.基于unlink的堆溢

Linux堆内存管理深入分析(上)

0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢出的漏洞利用资料就很少了.鄙人以为主要是堆溢出漏洞的门槛较高,需要先吃透相应操作系统的堆内存管理机制,而这部分内容一直是一个难点.因此本系列文章主要从Linux系统堆内存管理机制出发,逐步介绍诸如基本堆溢出漏洞.基于unlink的堆溢出漏洞利用.double free.use-after-free等

Linux堆内存管理深入分析 (上半部)【转】

转自:http://www.cnblogs.com/alisecurity/p/5486458.html 0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢出的漏洞利用资料就很少了.鄙人以为主要是堆溢出漏洞的门槛较高,需要先吃透相应操作系统的堆内存管理机制,而这部分内容一直是一个难点.因此本系列文章主要从Linux系统堆内存管理机制出发,逐步介绍诸

c++的问题-堆空间内存分配,关于首地址处记录分配内存的大小的问题

问题描述 堆空间内存分配,关于首地址处记录分配内存的大小的问题 堆空间内存分配时,首地址处记录分配内存的大小会不会占用内存空间. 大小记录在首地址处,如果占用了首地址的内存空间,首地址又怎么能用来存储数据了呢. 比如 char *a = new char; 分配的一个字节空间需要用来记录分配内存的大小,再拿来存字节'a',那么存储的大小信息不就丢失了吗? 求解答,万分感谢! 解决方案 a是在栈上,只不过他申请的空间是在堆上,记录分配内存的大小和地址是在页的首地址,不会用来存放a所对应的数据,a申

栈-有关地址的问题。。

问题描述 有关地址的问题.. 可以用栈存地址吗?像s–>top=(int* )malloc(sizeof(int));这个不一定正确 解决方案 U-Boot中的地址问题 解决方案二: 光看这一行,看不出问题.只是你要注意及时回收内存,避免内存泄漏. 解决方案三: 设置栈后,可以通过栈地址访问,注意不要越界,栈用完后要及时释放.