C与内存管理:你看我还有机会吗???

发表于:2020-7-21 10:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Tina_Tang    来源:SegmentFault博客

  在任何程序设计环境和语言中,内存管理都十分重要。这本文章基于C语言的基础上讲解内存管理。 这些是在学习和看别人优秀博客总结的知识点,由于个人水平有限,所以可能不够具体不够深入,见谅!
  为什么需要分配内存
  · 一个进程在运行过程中,代码是根据流程依次执行的,只需要访问一次,当然跳转和递归有可能使代码执行多次,而数据一般都需要访问多次,因此单独开辟空间以方便访问和节约空间。
  · 临时数据及需要再次使用的代码在运行时放入栈区中,生命周期短。
  · 全局数据和静态数据有可能在整个程序执行过程中都需要访问,因此单独存储管理。
  · 堆区由用户自由分配,以便管理。
  · C语言为内存分配和管理提供了几个函数,这些函数都可以在头文件<stdlib.h>中找到。
  · * void malloc(int num) 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。
  · **void realloc(void address, int newsize) 该函数重新分配内存,把内存扩展到 newsize。
  · * void calloc(int num, int size) 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。
  · * void free(void address) 该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。
  内存分配方式
  在C语言中,对象可以使用静态或动态的方式分配内存空间。 静态分配:编译器在处理程序源代码时分配。 动态分配:程序在执行时调用malloc库函数申请分配。 静态内存分配是在程序执行之前进行的因而效率比较高,而动态内存分配则可以灵活的处理未知数目的。
  静态与动态内存分配的主要区别如下:
  静态对象是有名字的变量,可以直接对其进行操作;动态对象是没有名字的一段地址,需要通过指针间接地对它进行操作。 静态对象的分配与释放由编译器自动处理;动态对象的分配与释放必须由程序员显式地管理,它通过malloc()和free两个函数来完成。
  静态分配
int a = 100;
  动态分配
p1 = (char *)malloc(10*sizeof(char));
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* 动态分配内存 */
description = (char *)malloc( 30 * sizeof(char) );
if( description == NULL )
{
fprintf(stderr, "Error - unable to allocate required memory\n");
}
else
{
strcpy( description, "Zara ali a DPS student.");
}
/* 假设您想要存储更大的描述信息 */
description = (char *) realloc( description, 100 * sizeof(char) );
if( description == NULL )
{
fprintf(stderr, "Error - unable to allocate required memory\n");
}
else
{
strcat( description, "She is in class 10th");
}
printf("Name = %s\n", name );
printf("Description: %s\n", description );
/* 使用 free() 函数释放内存 */
free(description);
}
  输出结果
Name=ZaraAliDescription:ZaraaliaDPSstudent.Sheisinclass10th

本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号