【第22期】观点:IT 行业加班,到底有没有价值?

动态内存分配课后小结(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语言标准函数库动态内存分配和释放分析

1,动态内存分配需要程序员手动来释放获得的内存 2,内存分配和释放函数: aligned_alloc:边界对齐的动态内存分配. calloc:数组的动态内存分配,且初始化为全零 malloc:动态内存分配,其内容不初始化 realloc:释放老的动态内存块,按照给出的尺寸分配新的动态内存块,老的内存块的内容尽量复制到新的内存块 free:系统释放动态分配的内存. 如果是空指针,则无动作发生; 如果指针所指不是动态分配的内存块或者是已释放的内存块,则行为是未定义的。 3

1. 动态内存分配

1. 动态内存分配 1.1 C语言的数据结构,通常都是固定大小的,比如:数组有固定的大小,而每个元素也有固定的长度。这样对程序有一定限制,例如:我们要使用数组来保存一个班级的学生信息,数组的长度...

专题5-1.动态内存分配(国嵌C语言视频)

1. 为什么使用动态内存分配  C语言中的一切操作都是基于内存的 变量和数组都是内存的别名,如何分配这些内存由编 译器在编译期间决定  定义数组的时候必须指定数组长度  而数组长度...

C和指针 (pointers on C)——第十一章:动态内存分配(上)

第十一章 动态内存分配 数组在声明的时候,本身作为一个指针常量,它在编译时候内存就已经被分配好了。但是有时候程序不知道这个数组到底有多长,所以,为了防止内存的浪费,C提供了动态内存分配的策略。 其实,作为独立的一章,本章显得内容不多。malloc,free,calloc,realloc就没有了,但是它包含很多用法,也有很多陷阱。 总结: malloc和calloc函数都用于动态分配一块内存,并返回一个指向该块内存的指针
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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