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

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

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

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

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

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

2.1K60

C++ 02 -

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

43020

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++函数库提供的,它的机制是很复杂的。

74250

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

10720

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

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

65750

_数据结构的区别

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

61420

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

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

1.1K20

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出来的实例和数组。

57530

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;

62910

的实现(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

8710

C语言的实现

因为方便:试想一下我们要判断是否空就只需要判断top是否等于buttom,如果buttom指向底显然就会麻烦许多 下面我们先用C语言来实现一下: 首先我们需要对这个装东西的“盒子”定义,而这个盒子就是...出一般有两种:1.让指定数据出2.让top指向的数据出,注意,如果要让指定的数据出,而且如果那个数据在中间,那你就不得不把从top到那个数据的全部节点出,因为是后进先出,而且只允许一段入/出...如果你不delete它它就会一直在中,每出一次就有一个无用节点占用内存,所以我们还要设法把这个无用节点删除,因此我们需要引入一个临时变量 void pop(struct stack *sk){ node...*n=sk->top; sk->top=n->next; delete n; } 就像上面,另还要注意出需要考虑是否为空,我没有写 至此,一个C语言版本的及其主要操作就完成了,这也是我第一次写结构...,因为我用C++ stack sk; sk.push(5); //..

3.8K40

洛谷 || C语言

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

1.2K30

-相关知识

一、预备知识—程序的内存分配 一个由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编译器中,参数是由右往左入的,然后是函数中的局部变量

72180

区别

参考如下代码: 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
领券