动态内存分配的C代码示例

简介: 概述 之前有同学在QQ上问我,C语言中的动态内存分配是怎么回事。首先,我们来看看内存分配的概念,它是指在程序执行的过程中分配或者回收存储空间的方法。

概述
之前有同学在QQ上问我,C语言中的动态内存分配是怎么回事。

首先,我们来看看内存分配的概念,它是指在程序执行的过程中分配或者回收存储空间的方法。一般说来,内存分配方法分为静态内存分配和动态内存分配两种。在本文中,我们主要讨论动态内存分配。
要实现动态内存分配,就需要有执行这个操作的对象。C语言考虑得很周到,它为我们提供的两个标准库函数:malloc和free。

malloc和free函数简介
malloc函数
原型:void *malloc(size_t size);
简介:该函数在内存的动态存储区中分配一块长度为size字节的连续区域;如果分配成功,则函数的返回值为该区域的首地址;如果分配失败,则返回空指针值NULL。

free函数
原型:void free(void *ptr);
简介:该函数将之前用malloc开辟的内存空间释放掉,无返回值。

从形式上看,malloc和free函数都非常的简单,只有一个输入参数。下面,我们用具体的C代码来演示它们的用法。

C代码示例

/**********************************************************************
* 版权所有(C)2016, Zhou Zhaoxiong
*
* 文件名称:DynamicMemoryAlloc.c
* 文件标识:无
* 内容摘要:示例动态内存分配
* 其它说明:无
* 当前版本:V1.0
* 作   者:ZhouZhaoxiong
* 完成日期:20160901
*
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>


// 重定义数据类型
typedef signed   int    INT32;
typedef signed   char   INT8;


/****************************************************************
* 功能描述: 主函数
* 输入参数: 无
* 输出参数: 无
* 返回值: 0-执行成功  -1-执行失败
* 其他说明: 无
* 修改日期        版本号         修改人          修改内容
*-------------------------------------------------------------
* 20160901       V1.0     Zhou Zhaoxiong       创建
****************************************************************/
INT32 main(void)
{
   INT8  szStrBuf[100] = {0};
   INT8 *pStr          = NULL;

   // 为指针变量分配内存
   pStr = malloc(100);
   if (NULL == pStr)    // 分配失败
   {
       printf("pStr is NULL!\n", pStr);
       return -1;       
   }
   memset(pStr, 0x00, 100);

   // 打印初始化变量的值
   printf("Step1: StrBuf=%s, pStr=%s\n", szStrBuf, pStr);

   // 给变量赋值
   memcpy(szStrBuf, "abcdefg", strlen("abcdefg"));
   memcpy(pStr, "1234567", strlen("1234567"));

   // 打印赋值之后的变量的值
   printf("Step2: StrBuf=%s, pStr=%s\n", szStrBuf, pStr);

   // 释放动态内存
   free(pStr);
   pStr = NULL;

   // 打印释放动态内存之后的变量的值
   printf("Step3: StrBuf=%s, pStr=%s\n", szStrBuf, pStr);

   // --------------------

   // 重新为指针变量分配内存
   pStr = malloc(50);
   if (NULL == pStr)    // 分配失败
   {
       printf("pStr is NULL!\n", pStr);
       return -1;       
   }
   memset(pStr, 0x00, 50);

   // 给变量赋值
   memcpy(szStrBuf, "abcdefg", strlen("abcdefg"));
   pStr = szStrBuf+1;

   // 打印重新分配动态内存之后的变量的值
   printf("Step4: StrBuf=%s, pStr=%s\n", szStrBuf, pStr);

   // 再次释放动态内存
   free(pStr);
   pStr = NULL;

   // 打印再次释放动态内存之后的变量的值
   printf("Step5: StrBuf=%s, pStr=%s\n", szStrBuf, pStr);

   return 0;
}

程序编译及运行
将上面编写的DynamicMemoryAlloc.c文件上传到Linux机器上,执行“gcc -g -oDynamicMemoryAlloc DynamicMemoryAlloc.c”命令,生成DynamicMemoryAlloc文件,然后执行“DynamicMemoryAlloc”命令,程序运行结果如下:

Step1: StrBuf=, pStr=
Step2: StrBuf=abcdefg, pStr=1234567
Step3: StrBuf=abcdefg, pStr=(null)
Step4: StrBuf=abcdefg, pStr=bcdefg
Step5: StrBuf=abcdefg, pStr=(null)

程序说明
第一,在main函数中,我们定义了两个变量:szStrBuf和pStr,其中szStrBuf在定义的时候已经给出了其占用内存空间的大小,因此该变量为静态内存分配;pStr变量在需要使用到的时候才分配内存,因此该变量为动态内存分配。

第二,我们使用malloc函数为变量分配动态内存,并使用free函数来释放动态内存,这两个函数要成对出现(即有一个malloc函数,就会有一个与之对应的free函数)。

第三,进行动态内存分配的变量的一个使用周期是在malloc函数和free函数之间,当一个变量的动态内存被释放掉之后,如果重新为它分配动态内存,那么它还是可以正常使用;例如,在main函数中,pStr变量先是被分配了100字节的空间,使用完成之后该空间就被释放掉了,当第二次为它分配50字节空间的时候,它又可以照常被使用了。

第四,从上面的代码可以看到,为进行动态内存分配的变量赋值的方式有两种,第一种是使用memcpy等函数进行赋值(如代码中的memcpy(pStr, “1234567”,strlen(“1234567”));),第二种是用另一个变量直接为它赋值(如代码中的pStr = szStrBuf+1;)。

总结
内存操作在C语言中占有非常重要的地位,而动态内存分配不当又是一个导致程序出现问题的主要原因之一。从本文中的代码可以看到,动态内存分配其实也没有什么特别困难之处,只要在需要用到某变量的时候为它分配一定的内存空间,在使用完成之后将该空间释放掉就行了。最为重要的是,malloc和free函数一定要配对出现。

最后再来举一个例子。上大学的时候,很多同学的生活费都是由家里给,有的家长在一学期或一学年开始的时候,就把整个学期或学年的生活费打到了卡上,而有的家长是按月打生活费的。这里的按学期或学年打生活费就相当于静态内存分配,而按月打生活费就相当于动态内存分配。

目录
相关文章
|
7月前
|
存储 缓存 Java
优化Java代码中的内存使用:使用WeakHashMap解决内存泄漏问题
在Java应用程序中,内存泄漏是一个常见的问题,尤其是在处理大量对象时。本文将介绍如何使用WeakHashMap数据结构来解决内存泄漏问题,通过示例代码演示其在实际项目中的应用,从而提高Java代码的性能和可靠性。
|
7月前
|
存储 数据可视化 C++
提高代码效率的6个Python内存优化技巧
当项目变得越来越大时,有效地管理计算资源是一个不可避免的需求。Python与C或c++等低级语言相比,似乎不够节省内存。 但是其实有许多方法可以显著优化Python程序的内存使用,这些方法可能在实际应用中并没有人注意,所以本文将重点介绍Python的内置机制,掌握它们将大大提高Python编程技能。
230 0
|
7月前
|
IDE Linux 开发工具
内存泄漏检测工具Valgrind:C++代码问题检测的利器(一)
内存泄漏检测工具Valgrind:C++代码问题检测的利器
1612 0
|
12天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
41 5
|
13天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
37 1
|
1月前
|
存储 JavaScript 前端开发
如何优化代码以避免闭包引起的内存泄露
本文介绍了闭包引起内存泄露的原因,并提供了几种优化代码的策略,帮助开发者有效避免内存泄露问题,提升应用性能。
|
7月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之idea本地测试代码,要增大 Flink CDC 在本地 IDEA 测试环境中的内存大小如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
108 1
|
7月前
|
存储 C++
webserver--Buffer类实现内存缓冲区读写(全代码)
webserver--Buffer类实现内存缓冲区读写(全代码)
|
4月前
|
存储 缓存 JSON
一行代码,我优化掉了1G内存占用
这里一行代码,指的是:String.intern()的调用,为了调用这一行代码,也写了几十行额外的代码。
|
4月前
|
缓存 Java
Java内存管理秘籍:掌握强软弱幻四大引用,让代码效率翻倍!
【8月更文挑战第29天】在Java中,引用是连接对象与内存的桥梁,主要分为强引用、软引用、弱引用和幻象引用。强引用确保对象生命周期由引用控制,适用于普通对象;软引用在内存不足时可被回收,适合用于内存敏感的缓存;弱引用在无强引用时即可被回收,适用于弱关联如监听器列表;幻象引用需与引用队列配合使用,用于跟踪对象回收状态,适用于执行清理工作。合理使用不同类型的引用车可以提升程序性能和资源管理效率。
48 4

热门文章

最新文章