C语言动态内存的分配实例详解

C语言动态内存的分配实例详解

什么是动态内存分配

C语言中的内存分为两种:静态内存和动态内存。

静态内存是在程序编写的时候,由编译器在编译时分配的一块内存空间,也就是常说的栈和全局变量。静态内存在程序生命周期内都是存在的,由系统负责内存的分配和管理。

而动态内存分配,则是在程序执行过程中,需要临时分配一块内存空间,用于存储数据,这种分配方式就是动态内存分配。

动态内存的分配由程序员自行控制,不受静态内存大小的限制,能有效地提高程序的灵活性。

动态内存分配的方法

C语言中,动态内存分配主要通过 malloc()free() 函数实现。
* malloc() 函数用于分配一段指定大小的内存空间并返回该分配空间的地址。
* free() 函数用于释放之前分配的内存空间。

接下来我们通过示例学习如何使用 malloc()free() 进行动态内存分配和释放。

示例一:分配内存空间

分配一段 4 字节空间,用于存储一个 int 类型的变量。

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 分配 4 字节内存空间
    int *p = (int *) malloc(4);

    if(p == NULL) {
         printf("空间分配失败 \n");
         return -1;
    }
    // 依次存入 3,2,1 三个数
    *p = 3;    
    *(p+1) = 2;
    *(p+2) = 1;
    printf("%d,%d,%d",*p,*(p+1),*(p+2));
    // 释放内存
    free(p);
    return 0;
}

首先使用 malloc() 函数分配了一段 4 字节的内存空间,并将其地址赋值给指针变量 p。接着依次将 3,2,1 三个数存储到了该内存空间中。最后,使用 free() 释放了所分配的内存空间。

示例二:重新分配内存空间

对上面的示例进行一些修改,重新分配 8 字节空间,存储 4 个 int 类型的变量。

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 分配 4 字节内存空间
    int *p = (int *) malloc(4);

    if(p == NULL) {
         printf("空间分配失败 \n");
         return -1;
    }
    // 依次存入 3,2,1 三个数
    *p = 3;    
    *(p+1) = 2;
    *(p+2) = 1;
    printf("%d,%d,%d",*p,*(p+1),*(p+2));
    // 重新分配 8 字节内存空间
    p = (int *)realloc(p, 8);
    *(p+3) = 4;
    printf(",%d", *(p+3));
    // 释放内存
    free(p);
    return 0;
}

代码中使用 realloc() 函数重新分配内存空间,并传入两个参数:原内存块地址和需要重新分配的内存块大小。重新分配后,使用指针 p 保存新分配的内存块地址,接下来向其相应的地址存储变量值。值得注意的是,重新分配内存空间前需要先释放之前分配的内存空间,不然会造成内存泄露。

综上,在 C 语言中,动态内存分配给我们提供了一种更加灵活、高效的方式来存储临时使用的数据,但也需要我们注意合理分配和释放内存,避免造成内存泄露等问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言动态内存的分配实例详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++ 如何用cout输出hex,oct,dec的解决方法

    使用C++中的cout语句输出数字时,默认是以10进制方式输出的,并且不直接支持以16进制和8进制的方式输出。为了输出16进制和8进制的数字,我们需要使用cout的标志控制。 1.输出16进制的数字 要想输出16进制的数字,需要使用cout中的hex控制符,它可以将数字转换为16进制输出。示例代码如下: #include <iostream> u…

    C 2023年5月23日
    00
  • Java深入讲解异常处理try catch的使用

    Java深入讲解异常处理try catch的使用 在Java中,异常处理是非常重要的一部分。通过异常处理,我们可以及时发现并解决程序中的错误,保证程序的正常运行。其中,try catch语句是最常用的异常处理方式之一。本文将详细讲解Java中异常处理try catch的使用,帮助读者更好地理解和掌握异常处理的方法。 try catch语句的基本用法 Java…

    C 2023年5月23日
    00
  • C++入门浅谈之类和对象

    C++入门浅谈之类和对象 什么是类和对象? 在 C++ 中,类是一种用户自定义的数据类型,它可以包含数据成员(属性)和成员函数(方法)。对象是类的实例化,即通过类来创建出来的一个具体的变量。 类的定义 定义一个类,可以使用以下的语法结构: class ClassName { private: // 私有成员变量 int privateVar; public:…

    C 2023年5月22日
    00
  • SQL查询语句行转列横向显示实例解析

    SQL查询语句行转列横向显示是一种在SQL语句中对行进行转换的简便方法。一般来说,数据表中的记录是按行排列的,而一条记录包含了一些列的信息。使用行转列的方法,我们可以把数据表中的每个记录都转换成一个横向的信息集合,列字段的值变为列的字段名。 实例一:使用PIVOT函数 Pivot函数是SQL Server中的一个内置函数,它可以实现行转列。 以下是一个示例:…

    C 2023年5月22日
    00
  • C#中DataTable 转换为 Json的方法汇总(三种方法)

    C#中将DataTable转换为Json有三种常见方法,分别是使用JavaScriptSerializer、Newtonsoft.Json和Json.net。下面我将详细介绍每种方法的步骤和示例代码,并分别说明它们的优缺点。 使用JavaScriptSerializer 步骤 在代码头部添加引用: using System.Web.Script.Serial…

    C 2023年5月23日
    00
  • c病毒程序原理分析(防范病毒 c语言小病毒示例)

    这篇文章主要是讲解如何防范病毒及 c 语言小病毒示例,文章中包含两条示例说明。 标题 C 病毒程序原理分析 正文 病毒是计算机领域中的一种非常危险的电脑程序,可以通过复制自身的方式感染计算机,破坏计算机系统的正常运行。在这篇文章中,我们将简单介绍 C 病毒程序的原理以及如何防范此类病毒。 防范病毒 升级防病毒软件:使用强大的防病毒软件可以有效的保护计算机系统…

    C 2023年5月23日
    00
  • Go项目中添加生成时间与版本信息的方法

    在Go项目中添加生成时间与版本信息,可以通过在编译时动态添加这些信息到可执行文件中,运行后即可查看。以下是完整的攻略。 第一步:定义版本信息 在项目的主程序中,定义一个常量来保存版本信息和生成时间。版本信息可以格式化成字符串,并随着时间一起更新。 const ( Version = "1.0" BuildTime = "2019…

    C 2023年5月22日
    00
  • windows 下C++生成Dump调试文件与分析

    下面是关于windows下C++生成Dump调试文件与分析的完整攻略: 生成Dump文件 一、在Visual Studio中生成Dump文件: 编译需要生成Dump文件的工程。在Visual Studio的“解决方案资源管理器”窗口中,选择需要生成Dump文件的工程,右键点击选择“属性”选项。 在弹出的“属性页”中选择“配置属性->调试”选项,勾选“生…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部