1.内存分配函数_alloca、malloc、realloc、calloc:

_alloca

  函数原型void * __cdecl _alloca(size_t);  头文件:malloc.h

  _alloca函数返回一个指向申请到的空间的void型指针。该函数向栈(stack)申请内存,用完就立刻释放,无需手动释放。

malloc 动态内存分配

  函数原型 extern void *malloc(unsigned int num_bytes);

  函数声明void *malloc(size_t size);  头文件stdlib.h   malloc.h

  malloc函数返回一个指向申请到的空间的void型指针,若申请失败则返回NULL。该函数向堆(heap)申请内存,不再使用该空间时,需要用free()释放。否则会造成内存泄漏。

calloc 动态内存分配并清零

  函数原型 void *calloc(size_t n, size_t size);  头文件 stdlib.h malloc.h

  calloc 函数在内存的动态存储区中分配n个长度为size的连续空间,返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。同样需要用free()释放。

  其中清零指:若是为字符类型或整型元素分配内存,这些元素会被初始化为0;若是为指针类型元素分配内存,其通常被初始化为空指针;若为实型数据分配内存,则被初始化为浮点型的零。

 //calloc分配完存储空间后将元素初始化
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)calloc(, sizeof(int));
for(int i = ; i < ; i++)
printf("%d", p[i]);
printf("\n");
free(p);
return ;
}

输出为十个0

realloc 动态内存调整(对malloc申请的内存进行大小的调整)

  函数原型extern void *realloc(void *mem_address, unsigned int newsize);   头文件:stdlib.h 有些编译器需要malloc.h

  指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。

  对于缩小:被缩小的那一部分的内容会丢失

  对于扩大:先判断当前的指针是否有足够的连续空间,如果有,直接从现存的数据后面向堆申请内存以扩大内存空间,即扩大mem_address指向的地址,并且将mem_address返回;如果空间不够,先按照newsize指定的大小分配其他空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

 //Eg1 realloc有足够内存空间分配
#include <stdio.h>
#include <stdlib.h>  int main()
{
char *p = (char *)malloc();
char *q = p;
p = (char *)realloc(p, );
printf("p=0x%x\n", p);
printf("q=0x%x\n", q); return ;
}
// 结果:p=0xb91398
// q=0xb91398
//验证:有足够内存空间分配 扩大p指向的空间,并将原来p返回。
 //Eg2 realloc无足够内存空间分配
#include <stdio.h>
#include <stdlib.h>  int main()
{
char *p = (char *)malloc();
char *q = p;
p = (char *)realloc(p,);
printf("p=0x%x\n", p);
printf("q=0x%x\n", q);
return ;
}
// 结果:p=0x690c50
// q=0x691398 内存地址改变
//验证:无足够内存空间分配 按newsize分配空间 将数据拷贝到新内存区域
// 返回新分配的内存区域的首地址

2.malloc、realloc、calloc异同点

同:1.头文件stdlib.h   malloc.h

  2.函数的返回值都是新申请内存空间的首地址,失败则返回NULL

  3.向堆(heap)申请内存,不再使用其申请空间时用free()释放

异:

malloc与calloc:calloc在动态分配完内存后,自动初始化该内存空间为零;而malloc不初始化,里面数据是随机的垃圾数据。

malloc与realloc:realloc是对malloc申请的内存进行大小的调整。缩小时,被缩小的那一部分的内容会丢失。扩大时,realloc会向堆中现存的数据后申请需扩大的内存,若成功,则返回地址与原首地址相同;若内存空间不够,则选取堆中足够大小的自由块,将原有数据依次拷贝到新地址,并释放原来所使用内存区域(系统自动释放),同时返回新分配的内存区域的首地址。

内存分配函数malloc、realloc、calloc、_alloca的更多相关文章

  1. Linux C 堆内存管理函数malloc()、calloc()、realloc()、free()详解

    C 编程中,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般 ...

  2. C语言内存分配函数malloc——————【Badboy】

    C语言中经常使用的内存分配函数有malloc.calloc和realloc等三个,当中.最经常使用的肯定是malloc,这里简单说一下这三者的差别和联系. 1.声明 这三个函数都在stdlib.h库文 ...

  3. C语言之内存分配函数

    #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { /********* ...

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

    转自:http://www.cnblogs.com/particle/archive/2012/09/01/2667034.html#commentform malloc: 原型:extern voi ...

  5. C内存分配函数

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

  6. C标准库-数值字符串转换与内存分配函数

    原文链接:http://www.orlion.ga/977/ 一.数值字符串转换函数 #include <stdlib.h> int atoi(const char *nptr); dou ...

  7. 内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。

    (1)内存管理函数与内存管理运算符的区别 内存管理函数有内存分配函数,malloc calloc realloc 以及内存释放函数free. 内存管理运算符有new 和delete. 两种内存管理方式 ...

  8. Linux内存分配小结--malloc、brk、mmap【转】

    转自:https://blog.csdn.net/gfgdsg/article/details/42709943 http://blog.163.com/xychenbaihu@yeah/blog/s ...

  9. Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc)

    Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc) 来源:http://blog.csdn.net/chunyexiyu/article/ ...

随机推荐

  1. jmeter随笔(11)--上传文件接口出错

    点击标题下「飞测」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期 ...

  2. freeglut第一步

    #include <GL/freeglut.h> static void RenderSceneCB() { glClear(GL_COLOR_BUFFER_BIT); glutSwapB ...

  3. 【练习】trace文本重建控制文件

    这个小练习是针对控制文件全部丢失后怎么能快速的重建一个控制文件,快速的起库 1.备份控制文件到trace下 SQL> alter database backup controlfile to t ...

  4. jQuery 的随机密码生成 .

    $.extend({ password: function (length, special) { var iteration = 0; var password = ""; va ...

  5. 恶心的Oracle的if else if...

    出处:http://blog.sina.com.cn/s/blog_407d47e60100d8ig.html 前段时间写Oracle存储过程就遇到问题.原来写成这样if 1=2 then  null ...

  6. MSP430F149学习之路——按键

    代码一: /********************************** 程序功能:用按键控制LED灯熄灭 ***********************************/ #incl ...

  7. 学习练习 java 不重复的三位偶数

    编写一个Java程序,计算一下1,2,…,9这9个数字可以组成多少个互不相同的.无重复数字的三位偶数. package com.hanqi; //编写一个Java程序,计算一下1,2,…,9 //这9 ...

  8. javascript代码复用模式(三)

    前面谈到了javascript的类式继承.这篇继续部分类式继承,及一些现代继承. 类式继承模式-代理构造函数 这种模式通过断开父对象与子对象之间原型之间的直接链接关系,来解决上次说到的共享一个原型所带 ...

  9. 织梦dedecms中html和xml格式的网站地图sitemap制作方法

    sitemap是网站上各网页的列表.创建并提交sitemap有助于百度(Google)发现并了解您网站上的所有网页,包括百度通过传统抓取方式可能找不到的网页.还可以使用sitemap提供有关你网站的其 ...

  10. Apache无法访问 Forbidden

    如图: 打开 找到: <Directory "E:/wamp/www/"> # # Possible values for the Options directive ...