C++堆栈生长方向

栈区:临时区

#include <iostream>

using namespace std;
#include <stdio.h>
int main()
{
    int a=100;
    int b=10;
    cout<<"/********************************/"<<endl;
    printf("%d\n",&a);
    printf("%d\n",&b);
    if(&a>&b){
        cout<<"down"<<endl;
    }else{
         cout<<"up"<<endl;
    }
    int c[10];
    cout<<"/********************************/"<<endl;
    for(int i=0;i<10;i++){
        c[i]=i;
    }
    cout<<"/********************************/"<<endl;
    for(int j=0;j<10;j++){
        printf("%d\n",&c[j]);
    }
    cout<<"/********************************/"<<endl;
    float *p=NULL;
    double *q=NULL;
    printf("%d\n",p);
    printf("%d\n",q);
     printf("%d\n",&p);
    printf("%d\n",&q);

    cout<<"/********************************/"<<endl;
    return 0;
}

  结论:&a>&b.先定义的变量a,后定义的变量b。变量a变量b都在临时区。因此栈向下生长的。对于数组地址随着下标越来越大,这是由于栈的生长方向和内存空间buf存放方向是两个不同的概念。

堆区:

#include <iostream>

using namespace std;
#include <stdio.h>
#include <stdlib.h>
int main()
{

    char *p=NULL;
    char *q=NULL;
    p=(char *)malloc(16*sizeof(char));
    q=(char *)malloc(16*sizeof(char));
    printf("\n%d\n",sizeof(char));
    printf("%d\n",&p);
    printf("%d\n",&q);
    printf("\np[0]:%d", &p[0]);
    printf("\np[1]:%d", &p[1]);
     printf("\nq[0]:%d", &q[0]);
    printf("\nq[1]:%d", &q[1]);
    if(p!=NULL){
        free(p);
    }
    if(q!=NULL){
        free(q);
    }

    return 0;
}

  结论:先定义的p指针和malloc区,在定义q指针和malloc区。在堆区p[0]比q[0]的大。而且p[1]比p[0]大。可知,堆是向上生长的。

时间: 2024-08-25 09:47:29

C++堆栈生长方向的相关文章

智能家居系统-软件设计

1 智能家居远程控制系统的软件实现 1.1 基于uC/OS-II的中央控制器的软件设计 1.1.1 uC/OS-II系统移植 本设计使用uC/OS-II操作系统,uC/OS-II是一个源码公开.可移植.可固化.可剪裁和抢占式的实时多任务操作系统,uC/OS-II的大部分源码是用标准ANSI C编写,并且编程规范,可读性很高,内核中只有少量的与硬件相关的代码使用汇编语言编写,总共200余行,移植非常方便[37].uC/OS-II软件体系结构如图5-1所示.移植工作主要包括以下几个方面的内容: 1)

入门 ARM 汇编(二)—— 寻址方式

忧愁他整天拉着我的心,像一个琴师操练他的琴:悲哀像是海礁间的飞涛:看他那汹涌,听他那呼号!—— 徐志摩·四行诗一首 ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 立即数寻址 源操作数为立即数,多用于给寄存器赋初值. 指令执行后,R1 寄存器的值就是 2. 立即数也可为:十六进制,# 后跟 0x:八进制,# 后跟 0:二进制,# 后跟 0b. 立即数有合法性限制,具体可 google 相关资料. 寄存器寻址 操作数的值在寄存器中. 指令执行后,R0 =

《Linux内核分析》课程第一周学习总结

姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 学习内容:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 第一部分:视频教学笔记总结 一.存储程序计算机 冯诺依曼体系结构概念:即具有存储程序计算机的体系结构,大多数拥有计算和存储功能的设备(手机.平板.计算机等)其核心构造均为冯诺依曼体系结构 冯诺依曼体系结构工作

可变参数函数详解

可变参数函数又称参数个数可变函数(本文也简称变参函数),即函数参数数目可变.原型声明格式为: type VarArgFunc(type FixedArg1, type FixedArg2, -); 其中,参数可分为两部分:数目确定的固定参数和数目可变的可选参数.函数至少需要一个固定参数,其声明与普通函数参数相同:可选参数由于数目不定(0个或以上),声明时用"-"表示("-"用作参数占位符).固定参数和可选参数共同构成可变参数函数的参数列表. 由于参数数目不定,使用可

码海拾遗:内存四区

C/C++编写的程序在分配内存时,通常划分为四个区域: 栈区(stack):存放函数的参数值.局部变量的值等,通常由编译器自动分配和释放 堆区(heap):动态分配的内存空间,由程序员分配和释放.若程序员忘记释放,将造成内存泄漏 数据区: 常量区:存放常量 全局/静态区:存放全局变量和静态变量 代码区:存放可执行代码的区域 堆栈生长方向和内存存放方向: 栈:栈生长方向与数组元素存放方向相反 堆:堆生长方向与数组元素存放方向相同

普通集合和泛型集合的区别,哈希表和字典表的区别,队列和堆栈的区别以及堆和栈的区别。

普通集合和泛型集合的区别: 泛型集合与传统集合相比 类型更安全. 泛型集合无需装箱拆箱操作. 泛型的重要性. 泛型是未来五年的主流技术 ... 通常情况下,建议您使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员.此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型(并优于从非泛型基集合类型派生的类型),因为使用泛型时不必对元素进行装箱. 下面的泛型类型对应于现有的集合类型: List 是对应于 ArrayList 的泛型类. Di

堆栈帧的组织——C/C++内存管理必须掌握

程序栈 说到堆栈帧,你得先说说程序栈. 记忆功能程序堆栈区是支持操作,通常共享堆. 程序栈通常占领内存区域的下部,而堆用的是上部. 程序栈存放栈帧,栈帧有时候也称为活跃记录或活跃帧.栈帧存放函数參数和局部变量.堆存放动态内存. 调用函数时,函数的栈帧被推到栈上.栈向上长出一个栈帧. 当函数终止时,其栈帧从程序栈上弹出. 栈帧所使用的内存不会被清理,可是终于可能会被推到程序栈上的还有一个栈帧覆盖. 动态分配的内存来自堆.堆向下生长.随着内存的分配与释放.堆中会布满碎片. 虽然堆是向下生长的,可是这

内存中的堆栈

函数调用入栈顺序 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数.再然后是函数中的局部变量.注意静态变量是不入栈的. Pascal语言中函数参数从左到右入栈的,C语言则从右至左.原因是Pascal语言不支持可变长参数,而C语言支持这种特色.通过栈堆分析可知,自左向右的入栈方式,最前面的参数被压在栈底.除非知道参数个数,否则是无法通过栈指针的相对位移求得最左边的参数. 堆栈溢出 堆栈溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址.堆栈

堆栈溢出

1.基础知识. 在x86处理器中:EIP(Instruction Pointer)是指令寄存器,指向处理器下条等待执行的指令地址(代码段内的偏移量),每次执行完相应汇编指令EIP值就会增加. ESP(Stack Pointer)是堆栈指针寄存器,存放执行函数对应栈帧的栈顶地址(也是系统栈的顶部),且始终指向栈顶: EBP(Base Pointer)是栈帧基址指针寄存器,存放执行函数对应栈帧的栈底地址,用于C运行库访问栈中的局部变量和参数. 从物理上讲,堆栈是就是一段连续分配的内存空间.在一个程序