转自https://www.cnblogs.com/tomato0906/articles/7711737.html

我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗??
既然有人会问这样的问题,那么我在这里好好的讲解一下吧!
首先让我们熟悉一下计算机的内存吧!在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存一些字符常量,比如:char *p_str=”cgat”;其中”cgat”就储存在字符常量区里面;3)全局区:在全局区里储存一些全局变量和静态变量;4)堆:堆主要是通过动态分配的储存空间,也就是我们接下需要讲的动态分配内存空间。
什么时候我们需要动态分配内存空间呢?举一个例子吧。int *p; 我们定义了一个指向int类型的指针p;p是用来储存一个地址的值的,我们之所以要为p
这个变量分配空间是让它有一个明确的指向,打个比方吧!你现在做好了一个指向方向的路标,但是你并没有让这个路标指向一个确切的方位,也就是说现在的这个路标是瞎指向的,这样我们就不能够通过它来明确到底哪里是东,哪里是西,何为北,何为南了。虽然我们在计算机的内存里定义了一个指针变量,但是我们并没有让这个变量指示一个确切int类型变量的地址,所以我们就必须要让它有一个明确的指示方向。这样我们就要通过动态分配内存的方式来认为的规定它的方向!
我们在刚刚接触指针的时候遇到过这样的情况,int *p;p=&a;这种方法不是指针的动态分配内存,这个叫做指针变量的初始化!初始化同样也可以让指针变量有方向可指。
int *p;p=malloc(n*sizeof(类型名称));我们通过malloc()函数为一个指针变量p分配了地址,这样我们从键盘上键入的值就这样存储在p里面了,接下来我们就可以对这个p进行具体的操作了,比如scanf(“%s”,p)等等。当我们对p结束操作的时候还要释放p的内存空间。为什么要释放内存空间呢?在上面我已经讲过动态分配的变量时储存在堆里面,但是这个堆的空间并不是无限大的,也许当我们编一个小的程序的时候可能我们并不能够发现什么,但是对于那些大的程序,如果我们比及时释放堆的空间的时候会放生内存泄露。所谓内存泄露是因为堆的空间北我们动态分配用完了,这样当我们再去使用动态分配堆的空间的时候就没有足够的空间让我们使用了,这样就需要占有原来的空间,也就是会把其他的空间来储存我们键入的值,这样会导致原来储存的数据被破坏掉,导致了内存的泄露了。
同时当我们使用malloc()函数的时候还应该注意当我们释放完空间的时候还要将原先的指针变量赋予一个NULL,也就是赋予一个空指针,留着下次的时候使用它!如果我们不赋予|NULL行不行呢??答案是:不行的!如果我们不赋予一个空指针这样会导致原先的指针变量成为了一个野指针!何谓野指针?野指针就是一个没有明确指向的指针,系统不知道它会指向什么地方,野指针是很危险的,因此当我们每次使用完malloc()函数的时候都必须将指针赋予一个空指针!相对于malloc()函数,calloc()函数就不需要我们赋予NULL了,这是因为在每次调用完calloc()函数的时候系统会自动将原先的指针赋予一个空指针,即归于“0”。calloc()函数的原型是void *calloc(count,sizeof(类型名称));比如:p=(char*)calloc(4,sizeof(char));我们为p分配了指向char型指针的“4”个空间。
除了malloc()与calloc(),还有一个动态分配空间的函数realloc()函数,这个函数比前两个函数分配更多的空间,原型:void *realloc(void *p,size_t size);
该函数有几个作用:
1)    如果有足够的空间来扩充p的内存块,则返回一个指向p的指针;
2)    如果没有足够的空间来扩充p的内存块,则为p从新分配size的空间,并把原来的内容复制给p,指向p的开头,同时释放原来的空间,返回一个指向新内存块的指针;
3)    如果p=NULL,其作用于malloc()相似;
下面举一个程序的例子:
#define LONG 10
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
main()
{
   char *message,buf[LONG];
   gets(buf);
   message=(char*)realloc(NULL,strlen(buf)+1);
   strcpy(message,buf);
   puts(message);
   gets(buf);
   message=(char*)realloc(message,(strlen(message)+strlen(buf)+1));
   strcat(message,buf);
   puts(message);
   return 0;
}

当你不确定内存空间大小的时候。。有2种办法。
1。预先定义一个足够大的空间。(这个比较浪费资源。而且随着程序的使用推广。预先定义的空间也不一定能完全满足条件)
2。动态的分配内存。可以做到准确分配空间大小。不浪费资源,而且也不会发生程序不断使用预先分配内存不足。
备注:动态分配的内存空间系统不负责自动回收,需要写代码手动释放。

c语言 什么时候需要malloc动态分配内存?相关推荐

  1. 【C】malloc动态分配内存和free释放

    先看一个例子 #include<stdio.h> int max=10; //data区,不产生具体的可执行代码. void main() {//局部变量都在栈区. 栈内存自动分配,释放. ...

  2. C语言malloc动态分配内存分配失败怎么办?exit(OVERFLOW);(include <cstdlib>)

    如:(见<大话数据结构>147页) QueuePtr s = (QueuePtr)malloc(sizeof(QNode)); if(!s){exit(OVERFLOW); } exit为 ...

  3. malloc()动态分配内存详解

    #include<stdio.h> #include<malloc.h>void main() {int a[5] = {4,10,2,8,6};int len;printf( ...

  4. c语言动态分配输出学生成绩,C语言之:结构体动态分配内存(利用结构体数组保存不超过10个学生的信息,每个学生的信息包括:学号、姓名和三门课(高数、物理和英语 )的成绩和平均分(整型)。)...

    题目内容: 利用结构体数组保存不超过10个学生的信息,每个学生的信息包括:学号.姓名和三门课(高数.物理和英语 )的成绩和平均分(整型). 编写程序,从键盘输入学生的人数,然后依次输入每个学生的学号. ...

  5. C语言计算机二级考动态分配内存吗,08年计算机二级C语言辅导:malloc动态分配的内存的生存周期是多少?...

    malloc动态分配的内存的生存周期是多少??当时直接回答,当然是在调用free进行释放之前阿!!但回头我仔细想过这个问题,在free调用之前那段范围内,但free只有一个指针参数,它是如何知道要释放 ...

  6. (篇二)C语言动态分配内存、计算π的值

    文章目录 一.动态分配内存 二.猴子吃桃问题 三.两种计算π的值 四.计算指定年月有几天 本篇是接着分享一些有趣的C语言实例,其实学习C语言这类结构化语言是非常锻炼逻辑思维的,也可以让我们对编程语言有 ...

  7. c语言动态的申请矩阵存储空间,C语言中二维数组如何申请动态分配内存

    C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include #include int main() { int **a; int i ...

  8. 【C 语言必知必会】内存管理、动态分配内存、野指针

    C 语言内存管理.动态分配内存.野指针 文章目录 C 语言内存管理.动态分配内存.野指针 前言: 1.内存分区 1.1 代码区 1.2.1 全局初始化数据区(静态数据区data段) 1.2.2 未初始 ...

  9. C语言动态分配内存实现字符串格式化拼接

    这两天的C语言开发工作中用到了多次字符串格式化拼接,分享一下自己写的一个接口,动态分配内存,减少因缓冲区大小不够导致字符串被截断的烦恼 直接上代码: #include <stdio.h> ...

最新文章

  1. [导入][转]好企业是什么样?
  2. 手把手教你在Linux上搭建BitTorrent服务器
  3. python下载网络错误_下载失败,出现“网络错误”+40000
  4. boost::hana::count用法的测试程序
  5. 常用的位操作:置位、清零与测试
  6. 因为加班,错过77万年终大奖,你还加班?
  7. 华为云企业级Redis评测第一期:稳定性与扩容表现
  8. Driver 初始化顺序
  9. JavaScript-switch语句
  10. Leaning perl 第2章练习题答案
  11. 2011最赚钱的行业和公司排行榜(verified 版本)
  12. unity, trail renderer gone black on iOS
  13. 一小时做出Java实战项目——飞翔的小鸟
  14. 【Vue脚手架安装教程】
  15. 什么是反射(Reflection)?它能做什么?
  16. c语言 拟合指数函数的代码,如何找到拟合指数函数的x?
  17. java lockmodetype_java-使用Spring Data JPA查找实体时如何启用LockModeType.PESSIMISTIC_WRITE?...
  18. 最简单的方式实现竖排文字显示
  19. dB与放大倍数的关系
  20. 矩阵模板(矩阵快速幂算法用法)

热门文章

  1. AMD HD7850 4G显卡刷Bios验真伪(二)
  2. flex..................
  3. 第十四章:下载安装WinRAR
  4. leetcode----1447.最简分数(辗转相除法求最大公约数)
  5. python 占位符_Python占位符总结:%方式和format方式
  6. 唯众物联网—基于物联网平台的Andorid实验设计与实现教学实训资源 免费开源
  7. js中的按位运算符详解‘‘ , ‘|‘, ‘^‘, ‘~‘, ‘<<‘, ‘>>‘, ‘>>>‘
  8. Appium中使用swipe方法时候出现的问题建议使用flick方法
  9. python实现SOR迭代法
  10. 【设计模式与Android】备忘录模式——在齐太史简