欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言小总-----malloc free

程序员文章站 2022-05-11 22:25:19
...

#include<malloc.h>//头文件

malloc 开辟的是字节数

malloc 只负责空间的开辟 不负责类型的说明
malloc出来的是无类型指针
其类型由自己的强转决定

malloc开辟的空间在堆中 程序结束后 这块空间不会被释放
因此 ip指向的malloc开辟空间的首地址 可以被return
但数组放在栈区 函数结束后空间被回收 因此数组名不可以被return

int main()
{	
	int *ip = NULL;
	char *cp = NULL;
	int n = 0;
	cin>>n;
	if(n<=0) return 0;
	ip = (int *)malloc(sizeof(int)*n);
	for(int i = 0;i<n;i++)	
	{
		ip[i] = i;
	}
	cp = (char *)malloc(sizeof(char)*n);
	for(int i = 0;i<n-1;i++)
	{
		cp[i] = i + 'a';
	}
	cp[n-1] = '\0';
	free(ip);
	free(cp);

}

C语言小总-----malloc free

C语言小总-----malloc free错误示范

int n = 10;
int *p = NULL;
p = (int *)malloc(sizeof(int)*n);
for(int i = 0;i<n;i++)
{	
	*p = i;
	p = p+1;
}
free(p);

正确示范

int n = 10;
int *p1 = NULL;
char *p2 = (int *)malloc(sizeof(int)*n);
p1 = p2;
for(int i = 0;i<n;i++)
{ 	
	 *p2 = i;
	 p2 = p2+1;
}
free(p1);

malloc 申请多少空间 之后就要释放多少空间

malloc 开辟的指针要妥善保管 不可以进行移动操作 否则 虽然编译没问题但 运行时会崩溃之前的空间就丢了

ip = (int *)malloc(sizeof(int));
*ip = 100;
free(ip);

申请空间后 会有1标识 防止他们使用此空间
释放空间后 将1 换成0标识 将内存里面的值清C

C语言小总-----malloc free
被free掉内存之后 指针指向之前的位置不会发生改变 依然会找到那个地址 叫做空悬指针 [非常可怕的家伙,可以通过此空悬指针去改变存放在此空间里的内容]
因此 为了避免这种事情的发生 因此free掉之后的指针要置空
C语言小总-----malloc free

堆区 如果开辟空间之后 需要释放空间 必须给出free 否则不释放

动静态开辟二维数组的区别

动态(malloc)开辟二的维数组 静态开辟二的维数组
存放在堆区 存放在栈区
内存不连续 内存连续
C语言小总-----malloc free C语言小总-----malloc free
结束时需要释放C语言小总-----malloc free 结束时不需要释放