首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【编程入门】C语言堆栈入门——的区别

在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。...堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。...下面就说说C语言程序内存分配中的,这里有必要把内存分配也提一下,大家不要嫌我啰嗦,一般情况下程序存放在Rom或Flash中,运行时需要拷到内存中执行,内存会分别存储不同的信息。...static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); } 0.申请方式和回收方式不同...: 在函数调用时,第一个进的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入的,然后是函数中的局部变量。

2.2K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【答疑释惑】C语言里面的区别

    很多初学者朋友对C语言里面的理解的不是太清楚,模模糊糊。他们到底有哪些区别呢?...2,增长方向:从高地址向低地址增长,也就是说空间使用越多,地址越小。空间从低地址向高地址增加,所以在不考虑中间有其他地址释放的情况下,后分配的对空间地址会比前面分配的大。...3,分配方式:空间通过指针移动自动实现,我们在写程序时并不关心这个问题。空间一般通过malloc/free或者new/delete来实现,这个过程需要我们显性管理。...5,使用效率:空间由于只需要指针移动,在汇编层面上只要一条指令即可,速度快的多。而内存的分配需要经过复杂的查询、异步保护,时间相对慢很多。...6,泄露情况:空间由编译器控制,不会发生内存泄露(否则就出现平衡问题)。而分配由程序员显性控制,人脑不是电脑,总有可能会出现不配对的情况,因此可能出现泄露。

    974120

    C++ 02 -

    C++中有如下区别: 管理方式 对于来讲, 是由编译器自动管理的. 对于来讲, 需要通过delete来控制....空间大小 空间大小根据编译器参数制约, 一般为1MB. 空间是根据机器字长决定的. 生长方向 是向下增长的, 也就是向着内存地址减小的方向增长的....是向上增长的, 也就是向着内存地址增加的方向增长. 分配方式 有两种分配方式: 静态分配和动态分配. 静态分配是编译器完成的, 比如局部变量的分配. 动态分配由alloca函数分配....是动态分配的, 通过malloc, realloc, calloc, new等方式申请. 回收方式 由编译器自动回收释放. 需要free, delete等方式手动释放....的分配是由上层的库函数提供分配算法. 如果没有足够的大小, 可能会进行系统调用去增加程序数据段的内存空间. 同时多次的new/delete会导致内存碎片. 这都使得分配的效率要低于.

    45820

    C语言共享

    的操作我相信大家都应该了解了弄懂了, 如果没弄懂希望可以去再去看看相关的资料,我博客中的C语言中缀表达式转后缀表达式中涉及到了一下的基本操作,有兴趣的朋友也可以看看。...所谓共享,就是两个共同使用一块内存空间,其中一个底作为另一个顶,反之亦然。...开始 思路分析 因为两个公用一个空间,假设一个为0#,规定其为空时top[0]==-1;另一个为1#规定其为空时,top[1]==MaxSize; 入时,先确定号是否合法,然后查看是对0#还是...1#进行操作,入操作和顺序的入操作并无太大不同。...如若入成功则返回0;入失败则返回-1; 出时,先确定号是否合法,然后查看是对0#还是1#进行操作,出操作和顺序的出操作并无太大不同。 选定之后进行出操作。

    1.2K30

    的区别主要有以下五点: 1、管理方式:对于来讲,是由编译器自动管理,无需我们手工控制;对于来讲,释放工作由程序员控制,容易产生memory leak(内存泄露)。...是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是由链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。的大小受限于计算机系统中有效的虚拟内存。...由此可见,获得的空间比较灵活,也比较大。 3、碎片问题: 对于来讲,频繁的new、delegate势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。...动态分配由alloca函数进行分配,但是的动态分配和是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。 都是动态分配的,没有静态分配的。...则是C/C++函数库提供的,它的机制是很复杂的。

    76550

    程序在系统上运行时,会为程序分配内存,有区 全局区 代码区 我们主要介绍区和区 由于是C语言复习,我不会讲一些汇编的东西,所有在这里讲的都是基于内存图和这种数据结构。...因为main函数中调用了函数sos ,将暂停当前的空间 继续开辟一块内存给sos函数使用 同理sauare函数继续开辟 当各个函数执行完成 空间依次清空每个函数的空间 最后执行到printf函数继续压...无限递归-一直在压 而没有清空 很快就会溢出 是系统为内存自动分配和销毁的一种数据结构,而需要程序员手动分配和创建,因此也被叫做动态内存 为了使用动态内存,需要介绍几个的操作函数malloc...calloc relloc free void* malloc (size_t size); malloc() 在区分配一块指定大小的内存空间,用来存放数据。...返回申请内存的首地址 否则返回NULL 原返回类型是未知类型的指针 我们可以转换成我们需要的指针通过强转 首先在区创建一个整型指针 然后用malloc在区申请一段4个字节的内存地址,并用p指向这段内存

    13420

    轻松带你解决c语言、数据段、代码段、bss段的疑惑

    当各位读者看到本次文章的标题,你可能会比较熟悉的用法,因为在你学完了c语言后,或多或少都会接触到一点数据结构(但是这里要讲的与数据结构里面的还是有点差别的,本次分析这个是从内存分配的角度去看...,它是0,也就是NULL那个值(它在c语言里面其实就是0,它是系统内存当中一块特殊的地址,你最好不要访问它,可能会出现段错误),不过这里我只是仅仅说明的遗留性,至于会出现这种情况原因,应该也是跟临时性有关...(它也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。(注意:全局变量才算是程序的数据,局部变量不算程序的数据(它在上),只能算是函数的数据)。...const型常量(它的用法之前有讲过,这里就不详细讲了,读者可以看之前的文章):C语言中const关键字用来定义常量,常量就是不能被改变的量。...(2)不同点:内存对应C中的普通局部变量(别的变量还用不了,而且是自动的,由编译器和运行时环境共同来提供服务的,程序员无法手工控制);内存完全是独立于我们的程序存在和管理的,程序需要内存时可以去手工申请

    1.4K20

    变量放在还是_的共同特点

    什么是区,什么是区(stack):由编译器自动分配释放 ,存放函数的参数值、局部变量的值等,内存的分配是连续的,类似于数组,当我们声明变量时,编译器会自动接着当前区的结尾来分配内存。...区(heap):由程序员分配释放, 若程序员不释放,程序结束时由OS回收,内存的分配不是连续的,类似于链表。 变量存放的位置 C/C++程序占用的内存分为以下几部分: 程序代码区 常量区存放常量。...,p3在上;体会与 char s[]="abc"; 的不同 static int c =0; //全局初始化区 p2 = (char *)malloc(20); //区 strcpy(p1, “123456...} 区和区的关系 1.当一个函数调用完返回后它会释放该函数中所有的空间。...3.C/C++函数库提供的,特点是灵活方便,数据适应面广泛,但是效率有一定降低,频繁申请和释放内存会产生内存碎片。

    71850

    _数据结构的区别

    大家好,又见面了,我是你们的朋友全君。 相信很多程序员对于的概念,总是感觉很朦胧,感觉在哪里听过见过,并没有深交。 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。...堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的,并且和汇编语言中的堆栈一词混为一谈。...堆栈数据结构区别 (数据结构):可以被看成是一棵树,如:堆排序。 (数据结构):一种先进后出的数据结构。...则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多...显然,的效率比要低得多。

    65820

    JVM --- &&参数调优

    : 1. 的基本介绍: 也叫内存,主要管java程序的运行,是线程私有的。它的生命周期是跟随线程的生命周期的,线程创建时创建,线程结束内存就释放。不存在垃圾回收。...帧主要保存以下3类数据(帧就是方法,在java代码中它叫方法,压到里面就叫帧): 本地变量:即输入参数、输出参数和方法内的变量; 操作:记录出、入的操作; 帧数据:类文件、方法等; 当你在...main方法中调用另一个方法fun的时候,首先是main方法进,压到底,然后是fun方法进,等fun执行完,会自动将fun弹出,再继续执行main,最后main方法出。...、方法区的交互: Person p1 = new Person(); Person p2 = new Person(); p1、p2是引用,上面说了,引用是中的,new Person()是在中完成的...所以中的p1、p2存储的是实例在中地址值。 三. : 1. 基本介绍: 一个JVM实例只存在一个的内存大小可以调节,存放的是new出来的实例和数组。

    60430

    C 语言】内存四区原理 ( 内存与内存对比示例 | 函数返回的内存指针 | 函数返回的内存指针 )

    文章目录 一、函数返回的内存指针 二、函数返回的内存指针 一、函数返回的内存指针 ---- 在 main 主函数中 , 调用 get_memory 子函数 , 返回 malloc 初始化的内存..., 可以 正常 使用指针 操作该 内存 ; 代码示例 : #include #include /* 该方法获取一块内存地址 */ char *get_memory...(int memory_size) { // 声明指针, 用于接收分配内存地址 // 该变量是在内存中 char *p = NULL; // 内存分配一块内存...return NULL; } // 返回分配的内存 return p; } int main() { char *p = NULL; // 获取内存地址 , 获取的是内存的地址...// 该内存是在 get_memory 函数中进行分配的 p = get_memory(10); if(p == NULL) { return 0;

    67410

    区别

    参考如下代码: int main() { // C 中用 malloc() 函数申请 char* p1 = (char *)malloc(10); cout<<(int*)p1<...<endl; //输出:00000000003BA0C0 // 用 free() 函数释放 free(p1); // C++ 中用 new 运算符申请...则是由C/C++提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。显然,的效率比要低得多。 (6)存放内容不同。...的基本操作包括初始化、判断是否为空、入、出以及获取顶元素等。下面以顺序为例,使用 C++ 给出一个简单的实现。...参考文献 [1] 浅谈的区别 [2] 内存和内存的区别 [3] 浅谈内存分配方式以及的区别 [4] C++函数调用过程深入分析 [5] 十种排序算法

    1.3K10

    Java编程语言内存区别详解

    java编程语言把内存分成两种,一种叫做内存,一种叫做内存。Java的是一个运行时数据区,类的对象从中分配空间。...的优势是,存取速度比要快,仅次于寄存器,数据可以共享。但缺点是,存在中的数据大小与生存期必须是确定的,缺乏灵活性。...从的功能和作用来通俗的比较,主要用来存放对象的,主要是用来执行程序的.而这种不同又主要是由于的特点决定的:   在编程中,例如C/C++中,所有的方法调用都是通过来进行的,所有的局部变量...是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用的效率非常低.但是的优点在于,编译器不必知道要从里分配多少存储空间,也不必知道存储的数据要在里停留多长的时间...事实上,面向对象的多态性,内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中,要求创建一个对象时,只需用new命令编制相关的代码即可。

    69530

    的实现(C语言版)

    将根节点最大的叫做最大堆或大根,根节点最小的叫做最小堆或小根的性质: 中某个节点的值总是不大于或不小于其父节点的值; 总是一棵完全二叉树。...的实现 初始化 的存储结构是一个数组,的初始化需要定义一个数组,当前元素个数和容量。和顺序表的初始化一样。...->a[0]; } 求的长度 先判断是否存在,直接返回的长度即可 size_t HeapSize(HP* php) { assert(php); return php->size; } 判断是否为空...先判断是否存在,如果php->size==0,那么为空,返回true,反之返回false bool HeapEmpty(HP* php) { assert(php); return php-...HeapPop(HP* php); HPDataType HeapTop(HP* php); size_t HeapSize(HP* php); bool HeapEmpty(HP* php); Heap.c

    11710

    -相关知识

    一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。...static int c =0; //全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在区...} 二、的理论知识  2.1申请方式  stack:  由系统自动分配。 ...  在C++中用new运算符    如p2 = (char *)malloc(10);  但是注意p1、p2本身是在中的。 ...2.5中的存储内容  : 在函数调用时,第一个进的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入的,然后是函数中的局部变量

    75380

    洛谷 || C语言

    题目背景 是计算机中经典的数据结构,简单的说,就是限制在一端进行插入删除操作的线性表。 有两种最重要的操作,即 pop(从顶弹出一个元素)和 push(将一个元素进)。...的重要性不言自明,任何一门数据结构的课程都会介绍。宁宁同学在复习的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。...题目描述 宁宁考虑的是这样一个问题:一个操作数序列1,2,…,n(图示为 1 到 3 的情况), A 的深度大于n。...现在可以进行两种操作, 将一个数,从操作数序列的头端移到的头端(对应数据结构的 push 操作) 将一个数,从的头端移到输出序列的尾端(对应数据结构的 pop 操作) 使用这两种操作,由一个操作数序列就可以得到一系列的输出序列

    1.3K30
    领券