黑马程序员——C语言内存管理

———-android培训、Java培训、iOS培训,期待与您交流———-

一、内存的分区

内存分区

  • BSS段:存储未初始化的全局变量和静态变量
  • 数据段:存储已初始化的全局变量和静态变量
  • 代码段:存储程序的执行代码
  • 堆(heap):存放进程运行中动态分配的内存段
  • 栈(stack):存放程序临时创建的局部变量

二、内存的分配方式

  1. 从静态存储区分配,内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量和static变量。
  2. 在栈上创建,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中,效率很高,但是分配的内存容量有限。
  3. 从堆上分配,亦称为动态内存分配。程序在运行的时候用malloc或new申请任意的内存,程序员自己负责何时用free或delete释放内存。动态内存的生存期限由程序员决定,使用灵活。

三、常用的动态内存分配函数

1. malloc

  • 使用方法:void *malloc(unsigned size)
    size是指分配内存的字节数
  • 说明:该方法包含在库函数stdlib.h中,作用是在内存的堆区分配一个大小为size的连续空间,如果分配内存成功,函数返回新分配内存的首地址,否则返回NULL。
    例如,申请一段内存空间存放3个float类型的变量,代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
    float *p = (float *)malloc(3*sizeof(float));
    if (p) {
        *p = 3.14;
        *(p+1) = 5.33;
        *(p+2) = 0.62;
    }else{
        printf("内存申请失败");
    }
    for (int i=0; i<3; i++) {
        printf("%.2f\t",*(p+i));
    }
    return 0;
}

2. calloc

  • 使用方法:calloc(块数,长度)
    使用calloc可以限制申请内存空间的大小。例如:calloc(4,sizeof(int));申请16个字节的内存空间。而实用malloc则不限制大小。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
    int *p = (int *)calloc(4, 4);
    if (p) { 
        *p = 2;
        *(p+1) = 5;
        *(p+2) = 3;
        *(p+3) = 6;
    }else{
        printf("内存申请失败");
    }
    for (int i=0; i<4; i++) {
        printf("%d\t",*(p+i));
    }
    return 0;
}

3. realloc

  • 使用方法:realloc(指针变量名,内存字节数)
  • 说明:当使用malloc或calloc申请的内存空间不够,需要扩充时,可以使用realloc。realloc会在内存中寻找一块扩充后大小的内存空间,如果原来的内存空间之后就有足够多的空闲空间,那么直接进行扩展。如果不够就会在内存中的其他区域寻找,当找到后会将原来内存空间前部分的值复制到新的空间中。
  • 例如,在上例的基础上,要将存储的数值增加到40个,那么执行如下代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
    float *p = (float *)calloc(5, sizeof(float));
    if (p) {
        *p = 2.67f;
        *(p+1) = 5.23f;
        *(p+2) = 3.44f;
        *(p+3) = 6.22f;
        *(p+4) = 5.11f;
    }else{
        printf("内存申请失败");
    }

    p = realloc(p, 40*sizeof(float));
    *(p+39) = 3.66;

    printf("%.2f\n",*(p+39));
    for (int i=0; i<5; i++) {
        printf("%.2f\t",*(p+i));
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值