C语言支持动态存储分配即在程序执行期间分配内存单元的能力,利用动态存储分配可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据泹是动态存储分配更常用于字符串、数组和结构体
本文地址:,转载请注明源地址
- malloc函数--分配内存块,但是不对内存块进行初始化
- calloc函数--分配内存块并且对内存块进行消除
- realloc函数--调整先前分配的内存块
malloc函数不需要对分配的内存快进行清除,所以它比calloc函数更高效
当申请内存块而調用内存分配函数的时候函数会返回void*型的值。内存中对象的空间大小是以“字节”的数目为单位计算的,许多头文件都定义了size_t类型專门用来保存这种“内存”空间的相关信息,比如sizeof运算符返回字节的数目类型是size_t
由于用名NULL的宏来表示空指针,所以常使用下列方式测试malloc函数的返回值:
在C语言中指针测试真假的方法和数的测试一样:
使用malloc函数为数组分配存储空间,需要使用sizeof运算符来计算每个元素所需要嘚空间数量
在分配了内存之后calloc函数会通过对所有位设置为0的方式进行初始化
ptr指向的内存块一定是先前通过malloc函数、calloc函数或realloc函数的调用获得嘚,size表示内存块的新尺寸
C语言标准列出几条关于realloc函数的规则:
- 当扩展内存块时realloc函数不会对添加进内存块的自己进行初始化
- 如果realloc函数不能按照要求扩大内存块,那么它会返回空指针并且在原有的内存块中的数据不会发生改变
- 如果realloc函数调用时以空指针作为第一个实际参数,那么它的行为就像malloc函数一样
- 如果realloc函数调用时以0作为第二个实际参数那么它会释放掉内存块
内存分配函数所获得的内存块都来自一个称为堆的存储池
上面的代码使得p和q都指向同一块内存,导致出现内存泄露使用free函数来释放不需要的内存,来回收垃圾