#include<stdio.h> #include"string.h" int main(){ int i=0; //栈 return 0; }
内存分区中最重要的两大区域:堆和栈
1. 首先来介绍栈是用来干嘛的
栈由操作系统自由分配释放,用来存放函数的参数值和变量值,函数中定义的局部变量,
栈的内存较小,有时候我们常常使用的递归算法,需要大量调用栈,有时操作不当,就会导致栈溢出。
2. 堆
堆的内存有很大,一般由开发人员(程序员开发),
用来动态申请内存的,都是申请内存在堆上。堆中存储的数据若未释放,则其生命周期等同于程序的生命周期,堆因为是程序员操控,可能会出现内存泄漏
堆和栈的一些不同
1.使用方式不同,一个是系统自动申请和释放,一个是程序员主动申请和释放。
2.空间大小不同,栈的内存远小于堆
3.生长方向不同。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。
4.堆一般都是动态分配,
5.分配效率不同。栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆的实现机制较为复杂,频繁的内存申请容易产生内存碎片。显然,堆的效率比栈要低得多。
6.存放内容不同。栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等
7.两者平时出现的问题 栈是调用栈太多次导致栈溢出,堆是容易出现内存泄漏,但是两个都要注意最好不要出现越界访问这种操作。
函数部分结束
1. malloc:(重要)
在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址
2.calloc:
与malloc相似,不过函数calloc() 会将所分配的内存空间中的每一位都初始化为零
3.realloc:(重要)
用来申请扩展内存,假如原始内存为0则会执行malloc的命令 给一个已经分配了地址的指针重新分配空间,可以做到对动态开辟内存大小的调整。
4.free
申请完内存就释放
(二)生成随机数的函数
rand函数和srand函数
两个不同的时间,由此可见我们的随机数生成的是一样的,所以 我们需要用srand这个是用来申请种子,srand()里面的参数也要随机数,但参数怎么能是随机数呢?
所以我们需要使用time 这个种子
#include"stdio.h" #include"time.h" #include"stdlib.h" //快速排序 void Swap(int*a,int*b){ int tmp=*b; *b=*a; *a=tmp; } int Partion(int*a,int left,int right){ int keyi=left; while(left<right){ while(a[right]>a[keyi]){ -- right; } while(a[left]<a[keyi]){ ++left;} Swap(&a[left],&a[right]); } Swap(&a[left],&a[keyi]); return left; } void QuickSort(int*a,int left,int right){ if(left>=right) return ; int keyi=Partion(a,left,right); QuickSort(a, left, keyi-1); QuickSort(a, keyi+1, right); } int main(){ int t=0; int i=0; int a[10]={6,3,2,1,4,5,7,8,9,0}; clock_t start,end; start=clock(); QuickSort(a, 0, 9); end=clock(); t=end-start; printf("函数运行时间:%ld\n",t); for(int i=0;i<10;i++){ printf("%d",a[i]);} return 0; }
上面的是时间