动态内存分配课后小结(1)

原创 2016年05月31日 09:07:38

      我们知道,当我们声明一个数组的时候,必须要用一个常量指定数组的长度,这是由于它所需要的内存空间取决于数据。但是如果我们不能预测程序所需要的精确数组长度,为了保证足够的空间,常常声明一个很大的长度,由此便可能造成不必要的空间浪费。所以引入了动态内存分配的概念。

    在动态内存分配中,C函数库给我们提供了四个函数,分别是malloc(),realloc(),calloc()以及free()。

一.malloc()函数的用法及注意事项

例:#include<stdio.h>

      #inlcude<stdlib.h>

int main()

{

int i=0;

int* p=(int* )malloc(10*sizeof(int));

/*这里给指针p开辟了4个整形空间的大小,即40个字节。注意此处必须有强制类型转换,还有sizeof所求长度的对象类型*/

if(p=NULL)

{

printf("out of memory");

exit(-1);

/*此处相当于exit(EXIT_FAILURE);*/

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

{

p[i]=i;

}

return 0;

}

}

注意:单次malloc开辟出的空间是连续的,内容并未初始化,是一个随机值。多次开辟出来的不一定连续,所以要考虑内存碎片的问题。

二.calloc()

calloc()的主要功能和malloc()一样用于分配内存,但是与后者不同的是在返回的时候将内存全部初始化为0,这将节省初始化的时间,calloc的参数包括所需元素的数量和每个元素的字节数。

例:#include<stdio.h>

int main( )

{

int i=0;

int* p=(int*)calloc(sizeof(int)*10);

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

{

p[i]=i;

}

return 0;

}

三.realloc()

这个函数主要用于修改已将分配的内存大小,在realloc(p,size)中,p指向前面已经分配好的内存,size指调整后的大小,而且p指向的内容必须是用malloc开辟出来的。如果在函数中调用了malloc函数,而且在函数调用之后不用free释放掉该空间,则该空间不会被释放,知道整个程序结束。

※在堆上开辟的空间,都必须用free()才能释放,例如malloc(),由此可说明free()内部有某种机制识别空间能否被free掉。

四,常见的动态内存错误

1.释放一部分开辟后的内容

#include<stdio.h>

int main( )

{

int* p=(int*)malloc(sizeof(int)*10);

free(p+5);/*释放5个整型空间的大小*/

return 0;

}

※.free之后,p的指针并不为空,依然指向原来的地址,因此在释放之后,一定要将p赋成NULL,而且在使用指针之前一定要判断其是否为空,但是free掉一个空指针是可以的。


本文出自 “福大馨” 博客,请务必保留此出处http://10800121.blog.51cto.com/10790121/1725432

版权声明:本文为博主原创文章,未经博主允许不得转载。

内存管理器(三)使用边界标识法实现内存分配器

使用边界标识法实现简单分配器前言前一篇我们已经了解了边界标识算法和数据结构,其实边界标识法还是比较复杂的,它的难点在于对C的使用的淋漓尽致,以及复杂的逻辑关系。所以我们还需要多思考,多体会才能领悟个中...
  • zmrlinux
  • zmrlinux
  • 2015年10月16日 17:29
  • 977

动态内存分配的C代码示例

之前有同学在QQ上问我,C语言中的动态内存分配是怎么回事。首先,我们来看看内存分配的概念,它是指在程序执行的过程中分配或者回收存储空间的方法。一般说来,内存分配方法分为静态内存分配和动态内存分配两种。...
  • zhouzxi
  • zhouzxi
  • 2016年09月02日 20:58
  • 3835

【面向对象】类和动态内存分配

类和动态内存分配 编译器生成的函数
  • wupenm
  • wupenm
  • 2015年09月02日 19:17
  • 1175

对象的动态内存分配

对象的动态内存分配 主要的就是对new和delete关键字的用法和要点  处理复制和赋值 如果没有在类中编写自己的复制构造函数和赋值运算符,C++将自动生成。默认的方法递归调用对象数据成员的复制...
  • GuFanYuan
  • GuFanYuan
  • 2015年03月05日 19:26
  • 719

Linux内核动态内存分配

在Linux中内核获取动态内存的方式相对进程是相当直接了当的。作为操作系统中优先级最高的成分,其内存请求不会被推迟,也不会插入任何针对编程错误的保护措施。其内存分配按其对象大致可分为三类:1. 连续页...
  • gufuguang
  • gufuguang
  • 2013年09月23日 09:49
  • 1305

C语言中手把手教你动态内存分配

C语言中手把手教你动态内存分配动态内存分配常见的内存分配的错误先上一个内存分配的思维导图:便于联想想象,理解: 首先我们介绍一下内存分配的方式:1:在静态存储区域中进行分配 内存在程序...
  • qq_29924041
  • qq_29924041
  • 2017年02月06日 23:21
  • 9889

C++-动态内存分配小结

1:总结并剖析malloc/free和new/delete之间关系和差异。 2:剖析new/delete、new[]/delete[]到底做了些什么事情。 3:实现NEW_ARRAY/DELETE_A...
  • sssssuuuuu666
  • sssssuuuuu666
  • 2017年07月04日 08:56
  • 321

C/C++动态分配与释放内存的区别详细解析

转自http://www.jb51.net/article/41723.htm 1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配。 ...
  • a573233077
  • a573233077
  • 2016年01月14日 16:59
  • 3405

浅析动态内存分配栈与堆

先举个例子:某用户需要一个将任意多个整数按大小排序的程序。(在计算机文件夹中,当文件很多时经常用到排序) 1。若不用动态分配内存,那就定义一个超大的数组吧!问题是,如果用户不需要那么大,不就浪费了?如...
  • u013013893
  • u013013893
  • 2016年01月12日 16:50
  • 1892

内存动态分配函数malloc的基本实现原理

malloc是C语言最常用的标准库函数之一,用于在程序运行中动态地申请内存空间。我们都会使用它,其函数原型为: extern void *malloc(unsigned int num_bytes);...
  • luckyjoy521
  • luckyjoy521
  • 2013年11月28日 16:01
  • 3936
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态内存分配课后小结(1)
举报原因:
原因补充:

(最多只允许输入30个字)