#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;
}
上面的是时间