# include<stdio.h>

//先讲最基本的语法,最后是完整的例子

# include <stdio.h>
# include <malloc.h> int main(void)
{int i = 5; int * p = (int *)malloc(4);*p = 5; free(p); printf("同志们好!\n");return 0;
}

/*

    2021/5/30   9:30

malloc 是memory(内存)  allocate(分配)的缩写(请求分配内存)

*/

# include<malloc.h> //malloc在malloc.h 文件中放着

int main(void)

{

int i = 5;                   // 14行

// 分配了4个字节 静态分配

int * p = (int *)malloc(4);            // 17行

// p 指向4个字节,但p本质上只保存了第一个字节地址,

4个字节只用首地址表示,int *类型已经让我们知道是4个字节为一个变量单元了

// p本身身为指针变量只能指向第一个字节地址,

但是 p 前面定义了数据类型 int ,达到的效果是 p 可以指向4个

//p 本身的4个字节内存和malloc分配的4个内存是不是一样的内存(动态?静态)

//不是  p 是 静态(数据类型+变量名) ,malloc (p 是栈里面的, malloc是堆里面的)

/*

1、要使用malloc函数,必须添加malloc.h这个头文件

2、malloc函数只有一个形参,并且是形参是整型

(系统定义的时候,有几个形参)(一个,实参只有一个,形参就只有一个),

如果实参一个形参两个,程序会报错。

3、4表示请求系统为本程序分配4个字节,malloc(必须是整数),字节不可能是3个半

4、malloc函数只能返回第一个字节的地址,

那第一个字节的地址有没有实际意义-- 没有,除非定义 数据类型

5、malloc函数分配了4个字节,而且只能返回第一个字节地址给 p

也就是系统通过 p 调用 malloc 函数时,通过 p 的值来确定malloc 函数的地址,

而malloc函数默认返回第一个字节地址

假设 p 刚好指向某个存储地址(一横代表一个字节地址),

因为malloc 函数刚好返回这一字节地址 (连续分配空间的4个字节的第一个字节地址(首地址))

那这时候,    p 到底占几个字节, p 指向的变量到底占几个字节?

(你不知道在4个字节里头,从第一个字节开始怎么去分配这4个字节,是一个个呢,还是2个2个,还是直接4个就当整体用了)

第一个字节地址本身不能确定它指向的变量到底占几个字节(不能确定它的大小)

(int *)malloc(4);把第一字节地址(这个地址本身无实际意义(malloc函数返回的第一个字节类型是void),

不加强制类型转换,地址的位数不能确定

 因为你连它是什么类型都不知道,这时候要强制转换成有实际意义的地址,可以让人们使用,看的懂)

强制转换成  一个 整型的地址(int *)

 (char*)malloc(100);  // 返回100个字节,一个字节一个变量

 (int*)malloc(100);   //  返回值还是一样的,还是第一个字节地址,

但是它知道第一个字节地址代表是整型变量的地址,

 mlloc函数就知道虽然只有第一个字节地址但是它知道按4个字节,

4个字节发放分配,最后整体100个字节是25个变量

malloc函数虽然返回了第一个字节的地址,但它表示的不是第一个字节的地址,

而是整型变量字节的地址,整型变量的地址肯定是4个,4个字节划分的

【注意】这里说的是如果(   )malloc前面不定义数据类型,

就无法确定指针变量所指向第一个字节的地址类型

最终分配几个字节:

p 也是个变量,有空间,需要4个字节保存,地址就是内存单元的编号,有32根地址总线来组合

(一个指针变量无论它指向的变量占几个字节,它本身都只占4个字节)

17行分配了8个字节, p 变量占4个字节,  p 所指向的内存也占4个字节(malloc所分配的)

6、 p 本身所占的内存(字节)是静态分配的,p 所指向的内存是动态分配的

*/

*p = 5;

// *p 是动态分配的 ,* p 表示的是 malloc所使用的 4个字节内存

// 代表的就是一个int 变量,只不过 *p 这个整型变量的内存分配方式和  14行 的 i 变量的分配方式不同

free(p);  // 终止 动态内存

// free(p); 表示把 p 所指向的内存(字节)给释放掉 ,p本身是静态的,指向地址字节是动态的

//本来这4个字节属于当前 叫malloc 的程序使用,所谓分配,

就是4个字节的使用权限给malloc了;而释放就是4个字节内存不能再用,不能写和读

 

//p本身的内存是静态的,不能由程序员手动释放,p 本身的内存(所占的字节)

只能再 p 变量所占的函数运行终止是由系统自动释放

printf("同志们好!\n");

return 0;

}

malloc函数的使用相关推荐

  1. malloc函数分配失败处理的严重性

    本次在实际测试情况下,发现程序无缘无故的异常,导致看门狗超时复位,经过排查是malloc函数分配失败的时候,依然对指针进行了操作,导致异常.以前没重视这个问题是因为,总觉的malloc基本都会成功的, ...

  2. linux c语言 malloc动态分配指针,C语言malloc函数为一维,二维,三维数组分配空间...

    c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...

  3. c语言malloc函数用法_小白对c语言数组的基础总结

    数组 数组是一系列相同类型元素有序的集合. 数组的定义: 一般形式为: 类型符 数组名 [常量表达式] 如 int a[5]; 表示数组有五个元素,a[0]-a[5],不存在元素a[5]. *注意: ...

  4. 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )

    文章目录 一.分析 malloc 函数的 arm 汇编语言 一.分析 malloc 函数的 arm 汇编语言 在上一篇博客 [Android 逆向]arm 汇编 ( 使用 IDA 解析 arm 架构的 ...

  5. 在malloc函数中为什么常用sizeof来设定内存分配的大小?

    在malloc函数中为什么常用sizeof来设定内存分配的大小? 例子:为40个整数变量分配内存并赋值,然后系统在收回这些内存. #include<stdlib.h> #include&l ...

  6. malloc函数具体解释

    一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc ...

  7. 【转】malloc函数实现原理!

    [转]malloc函数实现原理! https://blog.csdn.net/YEDITABA/article/details/53443792 重载new和delete来检测内存泄漏 posted ...

  8. C语言中malloc函数产生的内存泄漏问题

    一.malloc函数 使用malloc函数要注意:如果所申请的内存块大于目前堆上剩余的内存块(整块),则内存分配就会失败,函数返回值为NULL.注意这里说的是"堆上剩余内存块"不是 ...

  9. c语言之 malloc函数详解 在堆中动态分配内存malloc和new的区别

    一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc ...

  10. malloc()函数解析

    一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc ...

最新文章

  1. pytorch报错Unable to get repr for
  2. 【转】JPG打包压缩后比原来尺寸还大
  3. [译]Vulkan教程(32)生成mipmap
  4. 一个利用正则表达式进行代码重构,去除冗余代码的例子
  5. 十七、二分查找法(java)
  6. html div element,你能在TypeScript中扩展HTMLDivElement吗?
  7. 地址null一个简单的第三人称汽车驾驶系统
  8. Learn OpenGL(五)——定义自己的着色器
  9. mysql 分区 目的_MySQL分区表最佳实践
  10. linux ruby安装目录,SuseLInux下安装Ruby 及 Rails遇到的问题及解决方法
  11. java集合类习题_Java集合练习
  12. 计算机网络——自顶向下
  13. app接口开发整理(1)
  14. 偏微分方程数值解联系 - 向前差分法 - 一维热传导
  15. 【软件工程】对软件工程课程的希望及个人目标
  16. 机器学习算法入门与编程实践
  17. 《自己动手写cpu》读书笔记
  18. php段错误coredumped,段错误 (core dumped)
  19. java多核_java多线程中与多核cpu有什么关系?
  20. Java匹马行天下之一顿操作猛如虎,框架作用知多少?

热门文章

  1. 基于itil的it运维管理体系
  2. 2019年中国公有云厂商发展状况白皮书
  3. Oracle数据库的备份方式
  4. 湖南超级计算机研学,以超算之速,跨越弦歌千年 | 建宁实验中学中考励志研学...
  5. ESP8266/ESP32 驱动ST7789屏幕
  6. cognex扫码枪识别内容直接_S7-1200与 扫 描 枪 Cognex DM60S 通信问题。
  7. CSS绘制三角形—border法
  8. Golang 解析XML
  9. linux 定时器 库,linux 定时器
  10. 蜂鸣器驱动电路中二极管的作用