c语言学习必经之路-动态内存管理

文章目录

  • 关于动态内存管理的函数
    • malloc
    • calloc
    • realloc
    • free

关于动态内存管理的函数

申请空间:malloc calloc realloc
释放空间:free
原则:谁申请谁释放,防止产生内存泄露。

malloc

void *malloc(size_t size)

功能:在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址。

示例:

#include 
#include 
int main()
{
	int *p=NULL;
	p=malloc(sizeof(int));
	if(p==NULL)
	{
		printf("malloc() error!\n");
		exit(1);
	}
	*p=10;
	printf("%d\n",*p);
	free(p);

	exit(0);
}

动态数组实现

#include 
#include 
int main()
{
	int num=5,i;
	int *p;
	p=malloc(sizeof(int)*num);
	for(i=0;i<num;i++)
		scanf("%d",&p[i]);
	for(i=0;i<num;i++)
		printf("%d",p[i]);
	printf("\n")
	free(p);
	exit(0);
}

calloc

void* calloc(size_t num,size_t size);

功能:在内存的动态存储区中分配num个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL

示例
从这个例子可以看出calloc分配完存储空间后将元素初始化。输出十个0.

#include
#include
int main()
{
    int i;
    int* p = calloc(10, sizeof(int));
    for(i = 0;i < 10;i++)
        printf("%d", p[i]);
    printf("\n");
    free(p);
    exit(0);
}

realloc

void *realloc(void *ptr, size_t size);

功能
先判断当前的指针是否有足够的连续空间,如果有,扩大ptr指向的地址,并且将ptr返回,如果空间不够,先按照size指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来ptr所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

示例

#include
#include
int main()
{
	int i;
	int *p=malloc(5*sizeof(int));
	if (!p)
	{
  	 	printf("malloc fail\n");
   		exit(-1);
	}
	printf("malloc%p\n",p);
	for(i=0;i<5;i++)
		p[i]=i;
	p=(int*)realloc(p,10*sizeof(int));
	if (!p) 
	{
  	 	printf("realloc fail\n");
  		exit(-1);
	}
	printf("realloc%p\n",p);
	for(i=5;i<10;i++)
		p[i]=i;
	for(i=0;i<10;i++)
		printf("%3d",p[i]);
	free(p);
	p = NULL;
	return 0;
}

free

void free(void *ptr)

功能:释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。

你可能感兴趣的:(C语言,c语言,学习,开发语言,其他,c++)