堆溢出(二)


1.malloc

2.free

3.calloc

分配所需的内存空间,并返回一个(一组)指向它(它们)的指针。

malloc和calloc之间的不同点是,malloc不会设置内存为0,而calloc会设置分配的内存为0

4.realloc

更改已经配置的内存空间,即更改由malloc函数分配的内存空间的大小。

void *realloc(void *ptr,size_t size)   //ptr指向堆块或者为空
  1. 如果重新申请的大小大于申请内存的大小,且当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
  2. 如果重新申请的大小大于申请内存的大小,且当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置,相当于free()+malloc()
  3. 如果重新申请的大小小于申请内存的大小,堆块会直接缩小,被削减的内存会释放(直接释放到top chunk中)。
  4. 如果传入了一个空的堆块地址,但是size不是0,就相当于malloc()
  5. 如果传入了一个正常的堆块地址,但是size是0,那么就相当于free()
  6. 如果申请失败,将返回NULL,此时,原来的指针仍然有效。

文章作者: 0x00dream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0x00dream !
  目录