(C语言)动态内存开辟

         数据的元素存储于内存中连续的位置上,当一个数组被声明时,他所需要的内存在编译时就被分配。当然,我们也可以使用动态内存分配在运行时为他分配内存。在动态内存分配中我们需要经常用到malloc,free,calloc,realloc这四个函数。

       1、malloc和free

        malloc和free分别用于执行动态内存分配和释放。当我们需要调用一块内存时,就可以选择malloc函数,malloc会从内存中调用一块未被初始化的合适的内存,并向程序返回一个指向该块内存的指针。当一块以前分配的内存不再使用时,我们要用free函数把内存块归还给内存池。
        这两个函数的原型如下所示,他们都在头文件stdlib.h中实现:
        void     *malloc( size_t  size );
        void     free( void  *pointer );
        例:
      
#include<stdio.h>
#include<stdlib.h>

int main()
{
int i = 0;
int *p = (int *)malloc(10*sizeof(int));
//得到一个40字节的内存块,指针p指向该内存
if(p == NULL)   //判断动态内存开辟是否成功
{
printf("out of memory\n");
exit(EXIT_FAILURE);
}
for(i=0;i<10;i++)   //使用
{
*(p+i) = 10-i;
}
free(p);   //释放内存,防止内存泄漏
p = NULL;  //释放地址,防止非法访问
return 0;
}

        2、calloc和realloc

        calloc 也用于分配内存,malloc和calloc之间的主要区别是后者再返回指向内存的指针之前把它初始化为0,,另一个较小的区别是他们请求内存数量的方式不同。calloc的参数包括所需元素的数量和每个元素的字节数。
        realloc函数用于修改一个原先已经分配好的内存块的大小。如果用于扩大一个内存块,那么这块内存原先的内容依然保留,新增加的内存添加到原先内存块的后面,新内存并未以任何方式进行初始化。如果它用于缩小一个内存块,该内存块尾部的部分内存便被拿掉,剩余部分内存的原先内容依然保留。
【注意】
         如果原先的内存块无法改变大小,realloc将分配另一块正确大小的内存,并把原先那块内存的内容复制到新的块上,释放原有内存块,并返回新内存块的地址,但不会对新开辟的空间进行初始化。因此,再使用realloc之后,就不能再使用指向旧内存的指针,而是该改用realloc所返回的新指针。
        这两个函数的原型如下:
        void    *calloc( size_t  num_elements,size_t  element_size );
        void    realloc( void  *ptr,size_t  new_size );


        例1:
#include<stdio.h>
#include<stdlib.h>

int main()
{
int *ptr = (int *)calloc(10,sizeof(int));  //获取一个40字节的内存块
int i = 0;
if(ptr == NULL)   //判断动态内存是否开辟成功
{
printf("out of memory\n");
exit(EXIT_FAILURE);
}
for(i=0;i<10;i++)
{
*(ptr+i) = 10-i;
}
free(ptr);
ptr = NULL;
return 0;
}

例2:
#include<stdio.h>
#include<stdlib.h>

int main()
{
int *ptr = (int *)malloc(5*sizeof(int));  //获取一个20字节的内存块
if(ptr == NULL)  //判断动态内存开辟是否成功
{
perror("use malloc");  //提示错误信息
exit(EXIT_FAILURE);
}
p = realloc(ptr,20*sizeof(int));  //重新调整空间
//realloc会主动释放之前ptr的空间
if(p != NULL)
{
 ptr = p;
}
free(ptr);
ptr = NULL;
return 0;
}

      3、常见的动态内存错误

       ①小心越界访问
       ②malloc和free成对使用
       ③对NULL指针进行解引用操作
       ④对已经释放的动态内存的使用
       ⑤对动态开辟的内存的多次释放
       ⑥对动态开辟的内存的一部分进行释放
       ⑦free释放一块非动态开辟的内存
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值