C语言中堆空间的生成与释放详解_C 语言

堆空间的分配和释放
 #include <stdlib.h>
 malloc、calloc、realloc、free
 malloc
 void *malloc(size_t size);
 功能:在堆中分配 size 字节的连续空间
 参数:size_字节数
 返回值:成功返回分配空间的首地址,失败返回 NULL
 
 free
 void free(void *ptr);
 功能:释放由 malloc、calloc、realloc 分配的空间
 参数:ptr_空间的首地址
 返回值:无
 注意:
 1、每个空间只能释放一次
 2、ptr 必须是分配空间的首地址

 calloc
 void *calloc(size_t nmemb, size_t size);
 功能:在堆中分配 nmemb 块大小为 size 字节的连续空间
 参数:nmemb_数据块数 size_每块大小
 返回值:成功返回分配空间的首地址,失败返回 NULL
 注意:calloc 会把空间内容置 0,而 malloc 不会

 realloc
 void *realloc(void *ptr, size_t size);
 功能:在 malloc、calloc、realloc 分配的 ptr 开始空间,重新分配为 size 字节大小
 参数:ptr_malloc、calloc、realloc 分配空间首地址 size_总大小
 返回值:成功返回分配空间的首地址 失败返回 NULL
 
 注意:
 1、如果 size 小于原空间大小,不会起作用
 2、新增加的空间不会置 0
 3、如果 ptr 为 NULL,相当于 malloc(size)
 4、如果 ptr 不为 NULL 并且 size == 0,相当于 free(ptr)
 5、ptr 不需要释放,如果分配成功,只释放重新分配空间的首地址

时间: 2024-11-01 08:08:36

C语言中堆空间的生成与释放详解_C 语言的相关文章

C语言中操作进程信号的相关函数使用详解_C 语言

C语言signal()函数:设置信号处理方式头文件: #include <signal.h> 定义函数: void (*signal(int signum, void(* handler)(int)))(int); 函数说明:signal()会依参数signum 指定的信号编号来设置该信号的处理函数. 当指定的信号到达时就会跳转到参数handler 指定的函数执行. 如果参数handler 不是函数指针, 则必须是下列两个常数之一: 1.SIG_IGN 忽略参数signum 指定的信号. 2.

C++中赋值运算符与逗号运算符的用法详解_C 语言

赋值运算符 赋值符号"="就是赋值运算符,它的作用是将一个数据赋给一个变量.如"a=3"的作用是执行一次赋值操作(或称赋值运算).把常量3赋给变量a.也可以将一个表达式的值赋给一个变量.赋值过程中的类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时会自动进行类型转换. 1)  将浮点型数据(包括单.双精度)赋给整型变量时,舍弃其小数部分. 2)  将整型数据赋给浮点型变量时,数值不变,但以指数形式存储到变量中. 3) 将一个double型数据

C语言单向链表的表示与实现实例详解_C 语言

1.概述: C语言中的单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域.这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值. 如下图所示: 一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接 一个单向链表的节点被分成两个部分.第一个部分保存或者显示关于节点的信息,第二个部分存储下一个节点的地址.单向链表只可向一个方向遍历. 链表最基本的结构是在每个节点

C语言putenv()函数和getenv()函数的使用详解_C 语言

C语言putenv()函数:改变或增加环境变量头文件: #include4<stdlib.h> 定义函数: int putenv(const char * string); 函数说明:putenv()用来改变或增加环境变量的内容. 参数string 的格式为name=value, 如果该环境变量原先存在, 则变量内容会依参数string 改变, 否则此参数内容会成为新的环境变量. 返回值:执行成功则返回0, 有错误发生则返回-1. 错误代码:ENOMEM 内存不足, 无法配置新的环境变量空间.

VC++中进程与多进程管理的方法详解_C 语言

本文实例讲述了VC++中进程与多进程管理的方法,分享给大家供大家参考.具体方法分析如下: 摘要: 本文主要介绍了多任务管理中的多进程管理技术,对进程的互斥运行.子进程的创建与结束等作了较详细的阐述. 关键词: VC++6.0:进程:环境变量:子进程 进程 进程是当前操作系统下一个被加载到内存的.正在运行的应用程序的实例.每一个进程都是由内核对象和地址空间所组成的,内核对象可以让系统在其内存放有关进程的统计信息并使系统能够以此来管理进程,而地址空间则包括了所有程序模块的代码和数据以及线程堆栈.堆分

深入c++中临时对象的析构时机的详解_C 语言

c++中,临时对象一旦不需要,就会调用析构函数,释放其占有的资源:而具名对象则是与创建的顺序相反,依次调用析构函数. c++源码: 复制代码 代码如下: class X  {public:   int i;   int j;   ~X() {}   X() {} }; int main() {    X x1;    X();    x1.i = 1;    X x2;     } 对应的汇编码: 复制代码 代码如下: _main    PROC ; 11   : int main() {   

C++中求组合数的各种方法总结详解_C 语言

[问题]      组合问题 问题描述:找出从自然数1.2.... .n中任取r个数的所有组合.例如n=5,r=3的所有组合为: 1,2,31,2,4 1,3,4 2,3,4 1,2,5 1,3,5 2,3,5 1,4,5 2,4,5 3,4,5 用程序实现有几种方法: 1)穷举法 程序如下[程序]#include<stdio.h>const int n=5,r=3;int    i,j,k,counts=0; int main(){     for(i=1;i<=r ;i++)    

基于c++中的默认拷贝函数的使用详解_C 语言

<c++编程思想>上说一个类如果没有拷贝函数,那么编译器就会自动创建一个默认的拷贝函数.下面就让我们看一下真实的情况. 首先看一个简单的类X,这个类没有显示定义拷贝构造函数. c++源码如下: 复制代码 代码如下: class X {private:    int i;    int j;}; int main() {    X x1;//先定义对象x1    X x2 = x1;//将x1拷贝给x2} 下面是其汇编代码: 复制代码 代码如下: _main    PROC ; 7    : i

解析C++中四种强制类型转换的区别详解_C 语言

C++的四种强制类型转换,所以C++不是类型安全的.分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型.那为什么还需要一个新的C++类型的强制转换呢?新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换.C++中风格是static_cast<type>(content).C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干