malloc函数的使⽤# 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 指向的变量到底占⼏个字节?
molloc函数(你不知道在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;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。