C语⾔指针之⼆malloc的⽤法及详解
⼀、为什么c语⾔中要有malloc
malloc就是memory allocate动态分配内存,malloc的出现时为了弥补静态内存分配的缺点,静态分配内存有如下缺点:
1、⽐如说,传统的⼀维数组,如int a[5],使⽤传统的⼀维数组需要事先指定数组的长度,⽽且数组的长度必须是⼀个常量(宏定义的 常量)
2、传统数组(静态分配),不能⼿动释放,只能等待系统释放,静态分配的变量在该函数内运⾏的时候有效,当静态分配的变量所在函数运⾏完之后,该内存会⾃动释放。静态分配的内存,是在栈中分配的,其实在C语⾔中的函数调⽤也是通过栈来实现的,栈这种数据结构的⼀个特点就是(先进后出),所以,在调⽤函数的时候,都是先压⼊栈中,然后,再从最上⾯的函数开始执⾏,最后,执⾏到main函数结束。动态分配通过malloc分配,是在堆中分配的,堆不是⼀种数据结构,它是⼀种排序⽅式,堆排序。
3、传统数组的长度⼀旦定义之后,就不能更改,⽐如说,如果我有⼀个业务在这之前给分配的⼤⼩为100,但是,我现在由于业务数量的增长,原来的⼤⼩就⽆法满⾜。
4、静态分配不能跨函数调⽤,就是⽆法在另⼀个函数中,来管理⼀个函数中的内存。静态分配,只在当前函数有效,当,静态分配所在的函数运⾏完之后,该变量就不能被其他的函数所调⽤。
⼆、malloc是什么
malloc其实就是⼀个可以动态分配内存的函数,从⽽可以很好的弥补上⾯静态分配的缺点。
三、malloc怎么使⽤
1、使⽤malloc函数的时候,需要包含⼀个头⽂件#include <malloc.h>
2、malloc函数只接受⼀个形参如,int *p = (int *)malloc(sizeof(int)).先来解释下这句话的含义,int* p代表⼀个以int类型地址为内容的指针变量,p这个变量占4个字节(某些计算机),这个p变量是静态分配的⼀个变量。在某些计算机的前提下,指针变量所占的⼤⼩都是⼀样的,⽆论是char* 还是long *,因为,这些指针变量⾥⾯存放的是⼀个8位16进制的地址,所以占四个字节,当然这些都是在某些计算机的前提下,并不是所有的都是这样的。说道地址的话,就和计算机的地址总线有关,如果计算机的地址总线是32根,每根地址总线只有两种状态(1或0),32根地址线的话,如果全为1的话,刚好就是⼀个8位⼗六进制,⼀位⼗六进制等于四个⼆进制(2^4=16)。32根地址总线可以 表⽰2^10*2^10*2^10*2^2种状态,可以表⽰的最⼤内存为4G,也就是说32根地址总线(也就是四个字节的指针变量)最⼤可以
表⽰4G内存。malloc函数会返回开辟空间的⾸地址,加(int *)的⽬的是让计算机知道,如何去划分这个开辟的空间,因为char、int 、long这些类型的字节⼤⼩是不⼀样的,我们知道了⾸地址,还要知道是以⼏个字节为单元。所以,这句话⼀共开辟了8个字节(某些计算机上),这也是为什么我写sizeof(int),⽽不是直接写4的原因。
molloc函数3、malloc开辟空间所返回的⾸地址是动态分配的。
四、malloc函数的使⽤例⼦
# include <stdio.h>
# include <malloc.h>
int main(void)
{
int i = 5; //分配了4个字节静态分配
int * p = (int *)malloc(sizeof(4));//指针变量p为静态分配,malloc开辟的空间为动态分配
*p = 5; //*p 代表的就是⼀个int变量,指针变量p表⽰是⼀个以int类型的地址为内容的变量
free(p); //freep(p)表⽰把p所指向的内存给释放掉,p本⾝的内存是静态的,不能由程序员⼿动释放
//p本⾝的内存只能在p变量所在的函数运⾏终⽌时由系统⾃动释放
return 0;
}
# include <stdio.h>
# include <malloc.h>
void f(int * q)
{
*q = 200;
//free(q); //把q所指向的内存释放掉,不然后⾯在使⽤*p的时候会报错,因为p所指向的内容已经被释放了}
int main(void)
{
int * p = (int *)malloc(sizeof(int)); //sizeof(int)返回值是int所占的字节数
*p = 10;
f(p); //p是int *类型
printf("%d\n", *p);
return 0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论