1.malloc函数开辟动态内存存储区 void *malloc(unsigned int size)
①注意指针的类型为void,它只提供一个纯地址
②申请一组连续的空间,即为数组
#include<stdio.h>
#include<malloc.h>
int main()
{
int a = 0;
int *p1 = &a;
*p1 = 100;
printf("%d\n",a);//静态开辟空间
int a = 0;
int *p2 = (int *)malloc(sizeof(int));//动态开辟
//开辟了两个空间,在堆开辟了四个字节的整形空间(释放空间),一个是栈区开辟了保存p2这个指针变量的空间(不需要手动释放空间,)
*p2 = 100;
}
①int *p2 = (int *)malloc(sizeof(int));
*p2 = 100;
这样做会造成内存泄漏——动态开辟了内存空间而没有释放(用free函数释放动态存储区)
—— free(p1);释放的是p1指针所指向的空间,p1不会被付空,p1还是指向这个空间(将其称为野指针)
—— p=NULL;//释放指针,预防野指针
2.用calloc函数开辟动态存储空间void *malloc(unsigned n,unsigned size)
作用:是在内存的动态存储区中分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组
void main()
{
int n = 10;
int *p = (int *)calloc(n, sizeof(int));
}
p=calloc(50,4); //开辟50×4个字节的临时分配域,把首地址付给指针变量
注意:以上两个都要判断是否为空
if (pa == NULL)
{
printf("Out Of Memory.\n");
return;
}
3.用realloc函数重新分配动态存储区
realloc(p,50); //将p所指向的已分配的董涛空间改为50字节
void main()
{
int n = 10;
int *pa = (int*)malloc(sizeof(int)*n);//申请10个整形空间,强转为int类型
if (pa == NULL)
{
printf("Out Of Memory.\n");
return;
}
for (int i = 0; i < n; ++i)
{
pa[i] = i + 1;
}
for (int i = 0; i < n; ++i)
printf("%d", pa[i]);
printf("\n");
n = 10;
pa = (int*)realloc(pa, sizeof(int)*n);
free(pa);
pa = NULL;
if (pa == NULL)
{
printf("Out Of Memory.\n");
return;
}
for (int i = 5; i < n; ++i)
{
pa[i] = i + 1;
}
for (int i = 0; i < n; ++i)
printf("%d", pa[i]);
printf("\n");
}