一、动态存储分配

在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。

例如:
int n;
    scanf("%d",&n);
int a[n];

用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。

常用的内存管理函数有以下三个:

1.分配内存空间函数malloc

调用形式:

(类型说明符*)malloc(size)

功能:在内存的动态存储区中分配一块长度为"size"字节的连续区域。函数的返回值为该区域的首地址。

“类型说明符”表示把该区域用于何种数据类型。

(类型说明符*)表示把返回值强制转换为该类型指针。

“size”是一个无符号数。

例如:

pc=(char *)malloc(100);

表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。

2.分配内存空间函数 calloc

calloc 也用于分配内存空间。

调用形式:

(类型说明符*)calloc(n,size)

功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。

(类型说明符*)用于强制类型转换。

calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。

例如:
     ps=(struet stu*)calloc(2,sizeof(struct stu));

其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。

二、释放内存空间函数free

调用形式:
  free(void*ptr);

功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。

【例1】分配一块区域,输入一个学生数据。
main()
{
    struct stu
    {
      int num;
      char *name;
      char sex;
      float score;
    }  *ps;

ps=(struct stu*)malloc(sizeof(struct stu));
    ps->num=102;
    ps->name="Zhang ping";
    ps->sex='M';
    ps->score=62.5;
    printf("Number=%d Name=%s ",ps->num,ps->name);
    printf("sex=%c Score=%f ",ps->sex,ps->score);
    free(ps);
}

本例中,定义了结构stu,定义了stu类型指针变量ps。然后分配一块stu大内存区,并把首地址赋予ps,使ps指向该区域。再以ps为指向结构的指针变量对各成员赋值,并用printf输出各成员值。最后用free函数释放ps指向的内存空间。整个程序包含了申请内存空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。

free()只能释放堆内存,也就是malloc()创建的

前段时间,看某人代码的时候看到

free(q);
q->lru = *blk_head_lru.next;

这样一句,感觉有点奇怪,为啥一个指针free后,还能赋值,而结果也正确。
后百思不得其解。

后Google之,发现free后只是做了个标记,告诉系统这块内存不用了,一旦调用后, 那个地址是不被保护的, 也就是说其他的变量随时可能占用那个地址。

后想到如果free后,再malloc一个新变量那么那个值是否被覆盖了?

写了一代码试了试
#include <stdio.h>
#include <malloc.h>
int main()
{
int *a = (int *)malloc(sizeof(int));
*a = 5;
  free(a);
printf("a = %d\n",*a);
*a = 4;
printf("a = %d\n",*a);
int *b;
b = (int *)malloc(sizeof(int));
printf("a = %d\n",*a);
return 0;
}
VS2005编译通过。

如果有free
结果是
a = -572662307
a = 4
a = -842150451

如果注释掉free
a = 5
a = 4
a = 4

这是为什么呢?

C语言中的free函数相关推荐

  1. c语言中的printf函数_C语言中的printf()函数与示例

    c语言中的printf函数 C语言中的printf()函数 (printf() function in C) The printf() function is defined in the <s ...

  2. c语言的point函数,C语言中friend友元函数详细解析

    C语言中friend友元函数详细解析 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字frien ...

  3. C语言中的strstr函数

    C语言中的strstr函数 说到strstr函数,可能很多人会比较陌生,对比其他的字符串函数比如strcpy,strcmp等等,它的确比较少用,但其实他也是一个非常有用和常见的函数,今天,就让我们一起 ...

  4. C语言中的atoi函数的实现

    C语言中有很多的库函数,其实平时没事的时候多去实现一下里面的库函数还是很有用的,下面就来讲一讲C语言中的atoi函数,这个函数的主要功能是将一个字符串转化为一个数字,可能第一眼看上去,你会觉得这是一个 ...

  5. main c语言中变量的定义,C语言中在main函数中定义的变量是全局变量么_后端开发...

    PHP 和 JavaSript 区别_后端开发 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言,主要用于Web开发领域,而JavaSript是一种具有函数优先的轻量级,解释型或即时编译型的高 ...

  6. C语言中的sprint函数,求sprintf函数的详解

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:求sprintf函数的详解,要附带例,粘贴来的也可以,只 问题详情:还有就是我还想要一些常用的宽度修饰之类的输入或者输出格式:回答: ...

  7. c语言里面gets(a)是什么意思,C语言中的gets()函数

    在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回.如果要读取一行字符串, 比如:I love MIT 这种情况,scanf() ...

  8. C语言中的Sleep函数的解读

    Sleep函数: 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 注意: 在VC中使用带上头文件#include <windows.h& ...

  9. sleep函数的作用c语言,C语言中的sleep函数是什么意思【详细介绍】

    计算机知识:C语言中的Slee函数 Sleep函数简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned milliseconds); 在V ...

  10. c语言使用free释放指针报错,C语言中的free函数用法执行机制分析

    free函数是C语言或者C++程序语言的常用函数,那么free函数有什么用途呢?free函数又怎么用呢?C语言中的free函数用法执行机制分析,一起来看看free内部的机制以及和delete的对比分析 ...

最新文章

  1. TensorFlow文本情感分析实现
  2. xp系统本地连接服务器,本地连接,xp系统本地连接不见了怎么办
  3. Zabbix poller processes more than 75% busy
  4. 面向对象笔记2 原型链 解释
  5. TensorFlow维度变换函数语句
  6. mysql数据库备份(完全备份,增量备份)
  7. java陷阱常见面试题_Java常见陷阱
  8. maven 父maven_Maven不会吮吸。 。 。 但是Maven文件会
  9. View,SurfaceView,SurfaceHolder
  10. 浅谈java的静态代理模式
  11. python sftp连接_Python 脚本:创建SFTP连接传输数据
  12. C++中“强制转换”的四大天王
  13. 国内外优秀音视频博客
  14. 电脑的记事本如何显示行数
  15. png格式图像转成jpg图像时出现异常颜色值
  16. 嵌入式开发如何入门?
  17. 为win7系统盘减肥
  18. 未援与用户在此计算机,在里番世界里拯救世界
  19. python输出两个元素空格隔开_python实现将一串字符每两个一组,中间用空格隔开...
  20. 【问题思考总结】为什么跳跃间断点变上限积分连续但是不可导?【直观理解 几何方法】

热门文章

  1. ibm x60 学习linux,IBM X60 T60系列安装系统时SATA设置问题
  2. robotium测试
  3. codesmith mysql 注释_完美解决CodeSmith无法获取MySQL表及列Description说明注释的方案...
  4. JMX详解及JConsole使用
  5. SSH框架搭建和整合(struts2、spring4、hibernate5)
  6. 编写VTK文件,导入paraview显示
  7. 1.使用百度AI识图api,进行识图
  8. 调用百度识图api实现识图vue+springboot
  9. python 邮件分类_python_NLP实战之中文垃圾邮件分类
  10. debian关闭图形界面_禁止debian自动启动图形界面