C语言malloc函数解释和calloc函数

malloc函数

内存分为堆区(.heap),栈区(.stack),数据区(.data),代码区(.code)。 全局变量和静态变量存放在静态区,局部变量存在在栈区,动态申请的变量(即new,malloc函数申请的变量)存放在堆区。
根据之前的理解,全局变量和字符串常量存放于.data数据区中。而局部变量存放于栈区.stack
malloc用于开辟内存空间,free用于释放空间,如果申请了内存空间不用后,就一定要释放否则会出现内存泄漏,当不断的申请空间而不释放空间,最终会出现内存被“吃光”,当内存不足时返回NULL

int *p=(int*)malloc(10);
p=(int*)malloc(100);

上面的操作就会造成内存泄漏
(当然也不能对同一块空间free两遍,否则会产生程序崩溃。)
如果想free两便可以这么做

free(p);
p=NULL;
free(p);

上面的程序是正确的,因为free函数本身就带有检查NULL的能力,所以当第一次释放后,在对p赋值为NULL后再次进行free操作,在函数内部检测为NULL则return不作为。
申请空间是需要以字节个数申请,使用前需要预编译#include<malloc.h>

void main()
{
	int *p = NULL;
	int n;
	cin >> n;
	p = (int*)malloc(sizeof(int)*n);
}
void main()
{
	int *p = NULL;
	int n;
	cin >> n;
	p = (int*)malloc(sizeof(int)*n);
	//p = (int*)malloc(4*n);不要这样使用,这样函数的通用性不高
	for (int i = 0; i < n; i++)
		p[i] = i;  //千万不能写成*p=i;p++因为malloc开辟了空间后需要在释放空间,
	    //*(p+i)           //如果把指针的位置移动那么在释放时就会出现问题
	for (int i = 0; i < n; i++)
		cout << p[i] << " " << *(p+i)<<" ";
	cout << endl;
	free(p);//free后p指针变为空悬指针,原本他的空间比如有一个标记时已用,free后它的空间性质变为未用,但还是指向那块空间
	p = NULL;//所以在free后一定要给他赋值为NULL
}
int *getarray(int n)//不再生存期问题中,函数空间在栈中,malloc在堆中,虽然函数死亡,但是堆空间开辟的内存空间依旧存在
{
	int *s = (int *)malloc(sizeof(int)*n);
	return s;     //所以s在main中依旧能够在主函数中调用
}

void main()
{
	int n;
	cin >> n;
	int *p = getarray(n);
	for (int i = 0; i < n; i++)
		p[i] = i;
	for (int i = 0; i < n; i++)
		cout << p[i] << endl;
	free(p);
	p = NULL;
}

我们在使用malloc时尽可能开大空间,应为在内存空间中存放的不只是数据本身,还存在一些对数据的解释性数据,叫做头部信息,如果malloc的开的空间小但是,开辟次数很多的话,就会产生很多的头部信息,从而占用很多内存

另外解释一下calloc函数,它的本身很简单,大概来讲就是调用了malloc开辟空间后,如果成功开辟就会在调用memset函数,对开辟的空间进行初始化

calloc
函数原型:void *calloc(size_t n, size_t size);
功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

猜你喜欢

转载自blog.csdn.net/qq_40738945/article/details/85217834
今日推荐