首页 > 编程知识 正文

数据结构与算法分析 c语言描述,数据结构和c语言的关系

时间:2023-05-05 23:45:47 阅读:49708 作者:1057

malloc函数的作用malloc的全名是内存分配,在中文中称为动态内存分配。用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。

malloc ) )为堆区分配指定大小的内存空间并存储数据。 该内存区域在函数执行完成后不初始化,其值未知。 如果要在分配内存的同时进行初始化,请使用calloc ()函数。

malloc下级分类stdlib.h

例char*ptr=(char* ) malloc ) 10; //堆空间栈区变量分析,分配10字节的内存空间以存储字符原型void*malloc(size_tsize )

所有程序/软件的运行都由操作系统统一配置,操作系统是程序的运行环境

正在运行的多个程序之间,内存不交叉

程序结束后,操作系统释放正在使用的资源,用于其他程序

申请的空间种类分为5个区域堆栈区域(堆栈区域)、堆区域、全局区域、字符常量区域、代码区域,上述这些定义变量、数组都存储在内存的堆栈区域中。

为什么分成这么多区域? 在实际生活中,这和公司一样,只要部门了解得详细,工作就会有针对性、有效率。

谁申请?

堆栈区域特征:内存由系统申请,变量生命周期结束时系统释放。 也就是说,当程序被执行时,系统请求多个任务是检测变量是否应该被释放,简单来说,cpu抽出时间来执行该功能。 因此,如果这样的变量多,没有节制的定义,CPU的额外工作量就会增大,合并后程序的执行效率就会降低。堆区的特点:我们的程序员随时申请,我们自己随时释放。

在实际的APP应用中,系统限制了我们可用的堆栈空间大小。 (默认1M )堆栈溢出是突发堆栈。

可以通过编译器的属性修改此大小,但尽量不要修改。 不够了还得修改。

我们申请的空间不是由操作系统管理的,只要我们自己申请和释放,就可以申请任意大小的空间,而不会占用系统的额外资源。

引用: Lanciberrr文章

详细文章,malloc函数的详细使用方法和注意事项

关于内存

1、堆栈区域(堆栈)。

编译器自动分配并释放,保存函数的参数值、局部变量的值等。 内存分配是连续的,就像平时我们称之为堆栈一样。 如果还不知道,则认为是数组,其内存分配被连续分配。 也就是说,分配的内存位于连续的内存区域内。 声明变量后,编译器会自动在当前堆栈区域的末尾分配内存。

2、堆(heap )。

一般由程序员分配和释放,但如果程序员不释放,程序退出时操作系统可能会回收。 就像链表一样,内存中的分布不是连续的,不同区域的内存块通过指针链接在一起。 当一个节点与链断开连接时,必须人工从内存中释放断开的节点。

3、全局区域(静态区域) (静态) ) )。

全局变量和静态变量的存储置于块中,初始化的全局变量和静态变量位于块区域中,未初始化的全局变量和未初始化的静态变量位于相邻的另一块区域中。 程序结束后系统释放

4 .文字常数区域

常量字符串在这里。 程序结束后系统释放

5、程序代码区域

存储函数主体的二进制代码。

二.堆和栈的区别

1 .申请方式不同的堆栈:有系统自动分配。 例如,在函数中定义局部变量int a=0; 系统会自动在堆栈中打开合适的大小

注意:系统首先检查堆栈是否有足够的空间开拓该空间,有则直接开拓,没有则堆栈溢出

堆:程序员自己申请开拓并指定大小。 (使用new/malloc )

2 .申请大小限制

堆栈:在Windows上,堆栈是扩展到低地址的数据结构,是连续内存的区域。 堆栈顶部的地址和堆栈最大容量是系统预先确定的,在WINDOWS上,堆栈大小为2m ((有时也称为1m,但这是编译时确定的常数) ),申请的空间为star 因此,从堆栈中得到的空间很小。

堆:堆是扩展到高地址的数据结构,是不连续的内存区域。 这是因为系统是链表中存储的空闲存储器地址,所以当然是不连续的,但是链表的遍历方向是从低地址到高地址。 堆的大小受计算机系统中的有效虚拟内存限制。 由此可见,得到堆的空间比较灵活,比较大。

3 .申请效率比较:

堆栈:由系统自动分配,速度快。 但是程序员控制不了。

堆:由new/malloc分配的内存,通常速度较慢,容易出现内存碎片,但最容易使用。 (必须调用在new/malloc之后显示的free/delete以释放内存) )。

另外,在WINDOWS上,使用Virtu是最好的方法

alAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。

4.堆和栈中的存储内容

栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

5.底层不同

栈:是连续的空间

堆:不是连续的空间

请注意:在栈上所申请的内存空间,当我们出了变量所在的作用域后,系统会自动我们回收这些空间,而在堆上申请的空间,当出了相应的作用域以后,我们需要显式 的调用delete来释放所申请的内存空间,如果我们不及时得对这些空间进行释放,那么内存中的内存碎片就越来越多,从而我们的实际内存空间也就会变的越 来越少,即,孤立的内存块越来越多.在这里,我们知道,堆中的内存区域不是连续的,还是将有效的内存区域经过链表指针连接起来的,如果我们申请到了某一块 内存,那么这一块内存区将会从连续的(通过链表连接起来的)内存块上断开,如果我们在使用完后,不及时的对它进行释放,那么它就会孤立的开来,由于没有任 何指针指向它,所以这个区域将成为内存碎片,所以在使用完动态分配的内存(通过NEW申请)后,一定要显式的对它进行DELETE删除.

引用:忽晴忽雨的博文

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。


栈是一种 “特殊” 的线性存储结构,因此栈的具体实现有以下两种方式:
1.顺序栈:采用顺序存储结构可以模拟栈存储数据的特点,从而实现栈存储结构;
2.链栈:采用链式存储结构实现栈结构;

进栈和出栈
1.基于栈结构的特点,在实际应用中,通常只会对栈执行以下两种操作:
2.向栈中添加元素,此过程被称为"进栈"(入栈或压栈);
3.从栈中提取出指定元素,此过程被称为"出栈"(或弹栈);

慢慢收集补充吧。。。。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。