动态内存分配的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函数一定要配对出现。

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

目录
相关文章
|
3月前
|
存储 数据可视化 C++
提高代码效率的6个Python内存优化技巧
当项目变得越来越大时,有效地管理计算资源是一个不可避免的需求。Python与C或c++等低级语言相比,似乎不够节省内存。 但是其实有许多方法可以显著优化Python程序的内存使用,这些方法可能在实际应用中并没有人注意,所以本文将重点介绍Python的内置机制,掌握它们将大大提高Python编程技能。
95 0
|
1月前
|
IDE Linux 开发工具
内存泄漏检测工具Valgrind:C++代码问题检测的利器(一)
内存泄漏检测工具Valgrind:C++代码问题检测的利器
69 0
|
1月前
|
缓存 测试技术 开发工具
内存泄漏检测工具Valgrind:C++代码问题检测的利器(二)
内存泄漏检测工具Valgrind:C++代码问题检测的利器
35 0
|
3月前
小技巧分享:如何使用动态断点快速找到成对的 ABAP 内存 IMPORT 和 EXPORT 的代码位置
小技巧分享:如何使用动态断点快速找到成对的 ABAP 内存 IMPORT 和 EXPORT 的代码位置
23 0
|
3月前
|
Java 数据库连接
警惕内存泄漏与溢出!你的代码是否隐藏着致命危机?
警惕内存泄漏与溢出!你的代码是否隐藏着致命危机?
|
9月前
|
程序员 编译器 C语言
C语言指针理解 --- 代码配合图形讲解内存四区
C语言指针理解 --- 代码配合图形讲解内存四区
48 0
|
4月前
|
C++
c cpp 代码 数据竞争 分析, 以及 内存泄露 分析 工具 使用 demo
c cpp 代码 数据竞争 分析, 以及 内存泄露 分析 工具 使用 demo
30 0
|
5月前
|
存储 缓存 算法
深入理解内存管理:优化你的C++代码
深入理解内存管理:优化你的C++代码
|
5月前
|
监控 Java
电脑内存阈值监控代码示例
监控计算机内存的阈值有时候很重要。在Java中,可以使用Java Management Extensions (JMX) 来监控计算机内存的阈值。
466 0
|
10月前
|
存储 设计模式 缓存
解密Java享元模式:如何优化你的代码并减少内存占用?
解密Java享元模式:如何优化你的代码并减少内存占用?
1057 0

热门文章

最新文章