与堆操作相关的两个函数

malloc

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int main()
{char *p = malloc(10);  //内存随机,未做处理int i;for(i = 0; i < 10: i++){printf(“%d “,p[i]);}    free(p);return 0;
}

运行结果:(linux)

exbot@ubuntu:~/wangqinghe/C/20190630$ ./malloc

0 0 0 0 0 0 0 0 0 0

全是0表示分配的这块内存没有用过。

相同的代码在windows环境下运行必须将

char *p = malloc(10);换成 char *p = (char*)malloc(10);

因为malloc分配的地址是指向void*

不更换过来会报 invalid conversion from ‘void*’ to ‘char*’ 的错误

换过后的运行结果如下:

可以在使用malloc之后使用memset函数来初始化该指针指向的地址大小为0或者-1.(memset)只能初始化这两种值。

char *p = malloc(10);

memset(p,0,10);     //初始化所有内存为0

calloc

calloc函数可以直接达成这样的效果:分配内存并且同时初始化为0

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int main()
{//char *p = malloc(10);char *p = (char*)calloc(10,sizeof(char));int i;for(i = 0; i < 10; i++){printf("%d ",p[i]);}free(p);return 0;
}

realloc

想要将两个分配的内存块在一起,可以使用realloc函数

在原有内存基础之上,在堆中间增加连续的内存。

如果原有内存没有连续内存可扩展,那么会重新分配一个空间,将原有的内存copy到新空间,然后释放。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int main()
{char *p1 = (char*)calloc(10,sizeof(char));char *p2 = (char*)realloc(p1,10);int i;for(i = 0; i < 20; i++){printf("%d ",p2[i]);}free(p2);return 0;
}

在p1内存的基础上扩充,并且会自动初始化p1内存大小的内存为0;

若p2内存分配大小大于p1,那么多出来的内存则会有随机值。

char *p2 = (char*)realloc(NULL,10)  //等同于malloc;

realloc和malloc只分配内存,不处理。

转载于:https://www.cnblogs.com/wanghao-boke/p/11109453.html

malloc,calloc,realloc相关推荐

  1. 【C/C++】内存分配函数:malloc,calloc,realloc,_alloca

    [C/C++]内存分配函数:malloc,calloc,realloc,_alloca malloc: 原型:extern void *malloc(unsigned int num_bytes); ...

  2. C语言动态内存开辟详解(malloc,calloc,realloc,free,柔型数组)

    目录 一.概述 二.相关库函数的使用 1.malloc 2.calloc malloc vs. calloc 异同 3.free的使用 4.realloc 三.易错点 四.C\C++程序的内存开辟规则 ...

  3. 动态内存分布——malloc,calloc,realloc,free的使用。以及关于动态内存的常见错误。

    我们知道内存的使用方式,可以在栈区,静态区,堆区,申请空间来储存变量. 但是他们这些内存区所存储的东西是不一样的. 局部变量 函数的形式参数 栈区 动态内存分配申请的空间 malloc,calloc, ...

  4. malloc、calloc、realloc和free

    C 语言中开辟动态内存的有三个函数,分别为 malloc,calloc,realloc,释放内存的只有一个函数 free. realloc的使用是最容易犯错的,在写这篇博客前老师让我把realloc的 ...

  5. malloc、calloc、realloc、free、malloc_trim

    文章目录 malloc.calloc.realloc.free new和delete memset和memcpy malloc_trim() malloc.calloc.realloc.free ma ...

  6. C语言-动态内存管理(malloc()、calloc()、realloc()、free())

    C语言 动态内存分配 文章目录 C语言 动态内存分配 前言 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.初识malloc()和free() 2.malloc()和free()的简单使用 ...

  7. 详解malloc,calloc,realloc原理及其模拟实现

    malloc原理 malloc它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足 用户请求所需要的内存块.然后,将该内存块一分为二(一块的 ...

  8. malloc、calloc、realloc的区别

    (1)C语言跟内存分配方式 <1>从静态存储区域分配.        内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量. <2&g ...

  9. malloc、calloc、realloc和alloca各种的区别

    需要先包含头文件 #include"malloc.h" malloc是标准的在堆中开辟新的空间 比如 char *pt=(char *)malloc(10*sizeof(char) ...

  10. 动态内存管理 - malloc、calloc、realloc、柔性数组

    目录 一.为什么存在动态内存分配 二.动态内存函数的介绍 1.1 malloc 1.2 free 1) 动态开辟多少个字节的内存空间,返回该空间的起始地址:且开辟的空间使用方法,类似于数组,是一块连续 ...

最新文章

  1. Java 集合——List集合
  2. java中的equals方法
  3. 解惑解释性语言与编译性语言
  4. 【Python CheckiO 题解】Date and Time Converter
  5. 平时的鸿星尔克VS开挂后的鸿星尔克
  6. C++设计模式-解释器模式
  7. (24)FPGA开发必备(FPGA不积跬步101)
  8. Android 中的Binder跨进程通信机制与AIDL
  9. 智能网联汽车云控系统第2部分:车云数据交互规范
  10. 图解OAuth 2.0协议族(一):授权码 auth code
  11. 宝藏软件:“小狼毫” 一款开源牛叉输入法
  12. 支持wmv、mpg、mov、avi格式的网页视频播放代码
  13. C语言基础学习day04
  14. Mac锁屏 设置快捷键
  15. WINVER 和 _WIN32_WINNT
  16. Tableau长期免费使用的方法总结(包括Tableau Public,Tableau Desktop,Tableau Pre,Tableau eLearning)
  17. shell实现文本处理详解
  18. fabric QA
  19. DOSBox0.74的显示大小问题(调整分辨率)
  20. 使用新版IDEA创建JavaWeb项目详细图文教程

热门文章

  1. [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】
  2. 要想能安心,必须先死心。
  3. [转载]FPGA/CPLD重要设计思想及工程应用(时序及同步设计)
  4. [转]“UPA 中国”北京行业聚会笔录
  5. mysql集群重启offline_mysql集群搭建问题及解决方法集锦
  6. puppet enc mysql_精通Puppet配置管理工具
  7. 怎么查看MySQL 源码编译了什么_Mysql 源码编译教程贴
  8. 虐杀外星人java,逆天游戏《毁灭全人类2》登PS4 外星人疯狂虐杀地球人
  9. because the following virtual functions are pure within
  10. C语言技巧:把单一元素的数组放在末尾,struct可以拥有可变大小的数组