黑马程序员——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;
}
共67个01.嵌入 Non-Base14 字体-批量用.eal02.使用ICC配置标记图像----.eal03.删除所有图片.eal04.删除重叠的角线.eal05.1.通用定位点.eal05.2.中号机-A3-横-量多用这台机-割的准.eal05.3.小号机-不干胶-A3-横-咬位左边20mm.eal05.4_B2.eal07.翻书线-横向.eal08.翻书线-纵向.eal09.加透明色块.eal10.取消所有叠印.eal11.局部更改色彩.eal12.建立剪切蒙版.eal12.放蒙版.eal122232132132132132.eal13.曲线.eal14.条线粗细0.15改为0.08.eal15.条线粗细0改为0.15.eal16.条线粗细0改为0.25.eal17.条线粗细xx5改为0.15.eal18.细线加粗到0.08mm.eal19.添加可变文本-中间一刀切.eal20.添加可变文本-批量用-居中超大字放中间.eal20.添加可变文本-批量用-没页码.eal20.添加可变文本-批量用.eal21.A4-5.eal21.添加复制的图形右.eal22.添加复制的图形左.eal23.添加成品框 单黑.eal24.添加成品框 白色-2.5mm.eal25.添加成品框 白色-2mm.eal26.添加红色成品框 专色.eal27.添加页尾偶数页.eal28.添加页尾奇数页.eal29.添加页码-居中.eal30.添加页码.eal31.白色做4色爆肥.eal31.移动局部内容上.eal31.移动局部内容下.eal32.移动局部内容右.eal33.局部缩小内容.eal33.更改局部图片位置.eal33.移动局部内容左.eal34.移除出血、裁剪、裁切、作品框.eal35.转3色-czl.eal36.选中单个色-移动内容.eal37.选择第二个页面转180度.eal38.页面对半分割.eal39.十二折页添加折位线交互.eal40.作品框设置为裁切框.eal40.将所有专色设置为裁切框.eal40.指定一个专色设置为裁切框.eal41.压缩尺寸_留出血.eal41.拼合图层中对象.eal42.只选择超大尺寸-按比例缩小到A3.eal42.只选择超大尺寸-按比例缩小到A4.eal43.裁剪至可见.eal44.旋转内容.eal45.直接加3毫米角线.eal46.移除图形.eal47.删除不可见数据.eal48.内容上下居中.eal
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值