用指针实现内存动态分配

导引:已知:变量在使用前必须被定义且安排好存储空间。且变量有这么一些分类:全局变量、静态局部变量【它们的储存一般是在编译时确定,在程序开始执行前完成。】自动变量【在执行进入变量定义所在的复合语句时为它们分配存储,变量的大小也是静态确定的。临时定义的变量】。这些都是我们在书写的时候就确定的,然后进行编译。

但是!!一般情况下,运行中的很多存储要求在写程序时无法确定。由此我们引入动态存储管理的概念【指的是  不是由编译系统分配的,而是由用户在程序中通过动态分配获取】

正文:动态内存分配能有效地使用内存,让同一段内存可以有不同的用途 ,因为它有这样两个特点:1.使用时申请 2.用完就释放。

动态内存分配的步骤:【c语言来说】1.;了解需要多少空间2.用c的动态存储分配函数来进行空间的分配储存空间3.使用指针指向该内存空间,用指针对内存空间进行修改4.内存完成使命过后,释放内存。

下面介绍几种分配函数:

(第一种函数:申请储存空间)1.malloc():写法如下:void *malloc(unsigned size)这表示malloc在(动态)存储区中开辟的函数大小为size。如果申请成功,那么就会返回一个指向所分配内存空间的起始地址的指针;如果不成功,那么返回NULL(它的值为0).【注意返回值类型:void *    它是通用指针的一个重要用途, 将malloc的返回值转换(自己动手)到特定指针类型,赋给一个指针】。

示例:if(  ( p=(int*)malloc(n*sizeof(int) ) ==NULL );printf("not able to allocate memory.");(int*)表示强制转换成int型的指针malloc(n*sizeof(int)就是分配函数sizeof(int)就是算字长,*  n代表我需要的空间。调用malloc时,用 sizeof 计算存储块大小

每次动态分配都要检查是否成功,考虑例外情况处理,而且虽然存储块是动态分配的,但它的大小在分配后也是确定的,不要越界使用。

        2.calloc:写法:void*calloc(unsinged n,unsigned size),这个函数有两个形参不同于malloc,它可以自动将储存块全部转化为0.

重复一遍:malloc对所分配的存储块不做任何事情 ,calloc对整个区域进行初始化 !!

(第二种函数:释放储存空间)1.free写法:void free(void *ptr).ptr作为指针,它指向要释放空间的首地址。

(第三种函数:分配调整函数)realloc:  写法:void realloc(void *ptr,unsigned size);此函数的作用是重新调整内存空间,ptr必须是以前动态分配得到的指针,unsigned size是重新需要的空间大小。        如果调整失败,那么ptr指向的储存块的内容不变,函数返回值NULL。如果调整成功,那么新的内存空间就是size,且要与原来的储存块一致(假如新的内存大一些,就在原有的基础上再补;如果新的储存块比较小,那么就取原来的储存块的前size部分)。

如果要确保指针学懂了,那么要确认这几点:1.掌握指针作为函数的参数进行熟练编程,通过函数调用改变主调函数变量的值    2.利用指针进行数组相关操作((1) 实参是数组名 (2) 形参是指针变量      可以写成数组形式)   3.能够使用字符串常用处理函数进行编程(包含在头文件string.h里面),并能使用字符指针进行字符串相关操作(利用指针指向系统原有的字符串)  4.通过指针实现动态内存分配。

你可能感兴趣的:(c语言,c语言,数据结构)