郝斌老师c语言学习笔记----动态内存分配

动态内存分配

1. 传统数组的缺陷

(1)传统数组的内存空间不能手动释放
  • 一个数组被创建后在这个函数没有运行完毕时会一直存在
  • 当这个函数运行完毕后,这个数组所占用的内存空间被释放
(2)长度必须事先指定,且只能是常数,不能是变量
int a[5]; //正确
int a[len]; //错误
(3)数组的长度一旦定义,其长度就不能更改
  • 无法再函数运行期间去改变数组的长度大小(扩容、缩容)
(4)不能够跨函数使用
  • 函数运行期间,可以调用这个函数内部的数组,函数一旦运行完毕,这个数组就不可以再被使用

2 . 为什么使用动态内存

动态内存就很好解决了上述的四个问题

3 . malloc函数的使用

代码如下

#include<stdio.h>
#include<malloc.h>  //调用库函数,必须要有

int main(void) {

    int i = 5;
    int * p = (int *)malloc(4);   
    /*
        1.使用malloc函数必须要有<malloc.h>的函数声明
        2.malloc函数只有一个形参,并且形参是整型
        3. 4 表示请求系统为本程序分配 4 大小的字节数
        4.int * p = (int *)malloc(4)这条语句一共分配了8个
        字节,其中int * p 占4个字节(静态内存) (int *)malloc(4)占4个字节
        5.malloc函数返回的是第一个字节的地址
    */

    *p = 5;
    printf("p = %d", p);
    free(p);
    printf("p = %d", p);

    return 0;
}

4. 用malloc函数动态构造一维数组

构造一个可以自己指定长度的数组
#include<stdio.h>
#include<malloc.h>

int main(void){

    int len;
    int * p;

    printf("请输入要创建数组的长度:\n");
    scanf("%d", &len);
    p = (int *)malloc(len * sizeof(int));

    //给数组赋值
    for(int i=0; i<len; i++) {
        printf("请输入第%d个值:", i);
        scanf("%d", &(*(p+i)));
    }
    printf("\n");

    //数组输出
    printf("第一种输出方法:\n");
    for(i=0; i<len; i++) {
        printf("%d,", p[i]);
    }
    printf("\n");
    printf("第二种输出方法:\n");
    for(i=0; i<len; i++) {
        printf("%d,", *(p+i));         //p[i]永远等于*(p+i)
    }
    printf("\n");

    free(p);

    return 0;
}

5. 动态内存跨函数使用

(1)多级指针
//多级指针简单的小程序
int main(void) {
    int i = 5;
    int * p =&i;          //p 是 int *类型
    int ** q = &p;        //q 是 int **类型
    int *** r = &q;       //r 是 int ***类型

    printf("%d", ***r);      //此时 ***r 指向的是i
}

/*
    输出结果: 5
*/
(2)动态内存跨函数使用
void f(int ** q) {
    *q = (int *)malloc(sizeof(int));    //建立动态内存
    **q = 5;      //赋值
}


int main(void) {

    int * p;
    f(&p);
    printf("%d", *p);     //动态内存当函数执行完毕,如果不进行free它依然可以被其他函数使用   

    return 0;
}

/*
    输出结果 : 5
    总结: (1)对于静态内存,当函数执行完毕后,静态内存所占用的空间将不可以被其他函数使用
        (2)对于动态内存,如果不进行free操作,当函数执行完毕依旧可以被其他函数所调用
        (3)较为深入的可以理解为: 静态内存存放在栈中,动态内存存放在堆中
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值