## 动态内存分配的意义

C语言中的一切操作都是基于内存的

变量和数组都是内存的别名

内存分配由编译器在编译期间决定

定义数组的时候必须指定数组长度

数组长度是在编译期就必须确定的需求:

程序在运行过程中,可能需要使用一些额外的内存空间

malloc和freemalloc和free用于执行动态内存分配和释放malloc所分配的是一块连续的内存malloc以字节为单位,并且不带任何的类型信息free用于将动态内存归还系统

void* malloc(size_t size);

void free(void* pointer);malloc和free是库函数,而不是系统调用malloc实际分配的内存可能会比请求的多不能依赖于不同平台下的malloc行为当请求的动态内存无法满足时malloc返回NULL当free的参数为NULL时,函数直接返回

例:#include "stdio.h"

#include"malloc.h"

int main()

{

int* p = (int*)malloc(0);

printf("p = %p\n", p);

free(p);

return 0;

}

输出结果:

p = 008C1260

有malloc后面一定要跟free

calloc和realloc

malloc的同胞兄弟

void *calloc(size_t num,size_t size);

void realloc (voidpointer,size_t new_size);

calloc 的参数代表所返回内存的类型信息calloc会将返回的内存初始化为0,已经初始化了

realloc用于修改一个原先已经分配的内存块大小在使用realloc之后应该使用其返回值当pointer的第一个参数为NULL时,等价于malloc

例子:#include "stdio.h"

#include "malloc.h"

#define SIZE 5

int main()

{

int i = 0;

int* pI = (int*)malloc(SIZE*sizeof(int));

short* pS = (short*)calloc(SIZE,sizeof(short));

for(i = 0;i

{

printf("pI[%d] = %d,pS[%d] = %d\n", i, pI[i],i,pS[i]);

}

printf("Before:pI = %p\n",pI);

pI = (int*)realloc(pI, 2 * SIZE * sizeof(int));

printf("After:pI = %p\n",pI);

for(i = 0; i < 10; i ++)

{

printf("pI[%d] = %d\n", i ,pI[i]);

}

free(pI);

free(pS);

return 0;

}输出结果:pI[0] = -842150451,pS[0] = 0

pI[1] = -842150451,pS[1] = 0

pI[2] = -842150451,pS[2] = 0

pI[3] = -842150451,pS[3] = 0

pI[4] = -842150451,pS[4] = 0

Before:pI = 00C11260

After:pI = 00C112D8

pI[0] = -842150451

pI[1] = -842150451

pI[2] = -842150451

pI[3] = -842150451

pI[4] = -842150451

pI[5] = -842150451

pI[6] = -842150451

pI[7] = -842150451

pI[8] = -842150451

pI[9] = -842150451结果分析:

malloc没有初始化为0,但是calloc已经将结果初始化为0

小结:动态内存分配是C语言的强大功能程序能够在需要的时候有机会使用更多的内存malloc单纯的从系统中申请固定字节大小的内存calloc能以类型大小为单位申请内存并初始化为0relloc用于重置内存大小

c语言动态内存分配数组,【C】动态内存分配相关推荐

  1. 二维动态数组空间分配 c语言,科学网—C语言中动态二维数组的使用和分配 - 王一哲的博文...

    好多年不用C语言了,最后一次使用还是读研的时候写矩量法的时候了,看见VS的界面总能想起当年读书的时候的各种错误,往事随风.本程序应人之约,首先得到一个随机的矩阵,之后通过将矩阵分解为几个小矩阵统计小矩 ...

  2. 动态初始化一维数组详解

    /*动态初始化一维数组1.动态初始化一维数组,会在堆内存中分配这个数组并且数组中每一个元素都采用默认值byte short int long 0float double 0.0boolean fals ...

  3. c语言二维数组存储坐标,C语言的二维数组在内存中的存放顺序

    C语言的二维数组在内存中的存放顺序 发布时间:2020-06-28 18:23:49 来源:亿速云 阅读:708 作者:Leah 这期内容当中小编将会给大家带来有关C语言的二维数组在内存中的存放顺序, ...

  4. C/C++动态二维数组的内存分配和释放

    C语言: 1 //二维数组动态数组分配和释放 2 //数组指针的内存分配和释放 3 //方法一 4 char (*a)[N];//指向数组的指针 5 a = (char (*)[N])malloc(s ...

  5. 二维数组及其动态内存分配

    一.二维数组的基本概念 1.1 二维数组的内存映像 从内存角度看,二维数组和一维数组一样,在内存中都是连续分布的多个内存单元,并没有本质差别,只是内存的管理方式不一样,如下图所示 一维数组int a[ ...

  6. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(6)动态内存分配

    一.传统数组的缺点: 1.数组的长度必须事先定制,且只能是常整数,不能是变量 int len = 5; int a[len]; //error 2.传统形式定义的数组,该程序的内存程序员无法手动释放 ...

  7. 二维数组及其二维数组的动态内存分配

    本文为大一时所写的文章(2017/4/9),文笔还很生疏,在很多问题上认识不深,算是在学校的微信公众号上的一个编程探究模块上的投稿,本人当时也参与了本模块的维护和管理.补档. 今天我们来聊聊二维数组及 ...

  8. C语言为四维数组申请动态内存空间的方法(二)

    尝试了用堆栈的方式为四维数组申请动态内存空间,并将申请内存的操作封装成了子函数,方便在主程序中使用.希望对大家有用.代码如下: #include <stdio.h> #include &l ...

  9. C语言为四维数组申请动态内存空间的方法(一)

    尝试了用结构体为四维数组申请动态内存空间,希望对大家有用.代码如下: #include <stdio.h> #include <stdlib.h>typedef struct ...

最新文章

  1. MySQL面试题 | 附答案解析(九)
  2. 数组-二维数组中的查找
  3. 在iframe框架中全屏不好使的原因
  4. walletconnect
  5. Oracle PL SQL 精萃pdf
  6. wordpress修改mysql端口_Wordpress更改端口后访问自动跳转老端口
  7. Linux安装yum过程(超详细!)
  8. PayPal支付配置
  9. android请求网络接口(xutils3进行网络请求)
  10. 使用WebService获取第三方服务数据
  11. element-ui MessageBox 弹框判断确认和取消
  12. Matlab读取excel文件绘制折线图
  13. ks 曲线_关于模型检验的ROC值和KS值的异同_ROC曲线和KS值
  14. 万兴科技开启公司史上最大规模秋招,拟在长沙组建千人团队
  15. Caused by: org.activiti.engine.ActivitiException: resource ‘org/activiti/db/create/activiti.dm.creat
  16. 大数据技术之Flume —— (1)一文入门学习Flume
  17. O2O、B2B、C2C(通俗讲解)
  18. js截取最后一个特定字符后面的字符串
  19. yiyuan编程电子书系列(目录及种子)
  20. ctfshow 吃瓜杯八月赛 Misc WriteUp

热门文章

  1. spark restful_使用Spark构建简单的RESTful API
  2. 在线学习Java编程的最佳方法
  3. glassfish发布应用_WildFly 8与GlassFish 4 –选择哪个应用服务器
  4. 看到一个沙粒世界:再一次你好世界
  5. junit动态忽略测试_有条件忽略测试的JUnit规则
  6. 系统属性的JDK 12 Javadoc标记
  7. junit 运行_运行,JUnit! 跑!!!
  8. netbeans7.4_NetBeans 7.4的本机Java打包
  9. 使用Spring Boot和React进行Bootiful开发
  10. Java Date Nuances的痛苦提醒