C语言(1)----动态分配内存

        记得前些日子,我向第一个数组,但数组的大小会随着输入长度而定,于是就这样: int array[length]; 结果可以想到啦,数组定义里不可以有变量,于是我只能屈服于动态内存分配了。今天看到《c和指针》这本书的第11章 动态分配内存,以前的一些迷惑迎刃而解,所以想与大家分享一下
 
     首先我们为什么要使用动态内存分配?基于前面我遇到的问题,当声明数组时,我们必须用一个编译时的常量来指定数组的长度。但是当数组的长度常常运行时才知道,这是由于它所需要的内存空间取决于输入数据。举个例子,一个用于计算学生等级和平均分的程序可能需要存储一个班级所有学生的数据,但是不同班级的学生数量可能不同。这些情况下,我们通常采用的方法是声明一个较大的数组,它可以容纳可能出现的最多元素。但是仔细分析后,这样的方法有几个缺陷:1 如果程序中需要的元素超过了声明的长度,它就无法处理这种情况;2  如果输入数据只有一小部分,我们定了一个很大的数组,这样就造成了大量的内存浪费。

下面讲一下分配内存的几个函数
1 malloc和free函数 :分别执行动态内存分配和释放。
他们维护一个内存池,当程序需要一些内存时,调用malloc函数,malloc从内存中提取一块合适的内存,并想该程序返回一个指向这块内存的指针。注意,这块内存没有初始化。  当分配的内存不使用时,调用free函数释放。
函数原型:
void *malloc(size_t size);
void free(void *pointer);
malloc的参数就是需要分配的内存字节数。如果内存中的可用内存可以满足需求,malloc返回一个指向被分配的内存块起始位置的指针。
malloc分配的是连续的内存。 如果内存无法满足请求,malloc就会返回一个NULL指针。因此我们在使用malloc时,一定要进行检查,确保它是非NULL是非常重要的。
free 的参数必须是通过malloc  calloc  realloc 返回的值,向free 传递一个空指针没有任何效果。
我们看到 malloc 返回类型是 void * 的指针,那么malloc如何知道请求的内存需要存储的是整数、浮点值、结构还是数组呢?我们在使用的时候要进行一个类型转换,将void* 转换为我们需要的类型。

2  calloc 和realloc 函数
原型如下:
void * calloc(size_t num_elements, size_t element_size);
void * realloc(void *ptr,size_t new_size);
calloc也是用于分配内存。calloc与malloc之间的主要区别在于calloc分配的内存都会初始化为0;另一个区别就是请求内存数量的方式不同。calloc的参数包括所需元素的数量和每个元素的字节数。字节数是二者相乘。
realloc函数用于修改一个原先已经分配的内存大小。使用这个函数可以对一块内存扩大或者缩小。如果扩大一个内存,原先的内存保留,新添加的内存放到之前内存的后面,新内存没有初始化。如果缩小内存,该块内存尾部的部分内存被拿掉,剩余部分保留。如果原先内存不能改变大小,realloc分配一块正确大小的内存,并把原先内存复制到新的块上。

3 标准分配内存与使用动态分配内存
我们分配一个含有25个元素的指向int数组
int *str;
str = malloc(25*sizeof(int));
if(str==NULL)
{
    printf(" malloc memory error! ");
	exit(1);
}
 
 
在使用中,我们可以间接访问和指针运算访问数组的不同位置。
for(i=0;i<25;i++)
       *str++=0;
</pre>
或者
for(i=0;i<25;i++)
    pi[i]=0;

4  需要注意的一些地方
 1) 一定要检查malloc 函数返回的指针是否为NULL
 2) 不要访问动态分配的内存之外的区域
 3) free函数的参数一定要是有malloc  calloc realloc 返回的指针
 4) 动态分配的内存不使用后一定要释放 
(我的微博:http://weibo.com/u/2729471010/home?wvr=5    微信:yuansanwan   欢迎关注)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值