数据结构,C语言(部分基础杂碎知识)

本文介绍了内存的栈和堆区域,强调了它们的区别,如分配方式、空间大小和效率。栈用于函数参数和局部变量,而堆用于动态内存申请。同时,提到了动态内存管理函数malloc、calloc、realloc和free。此外,还讨论了随机数生成,包括rand和srand函数的使用。最后,文章演示了一个快速排序的实现并测量了其运行时间。
摘要由CSDN通过智能技术生成
#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;
}

 

上面的是时间

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗哥不是甜妹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值