11动态数组
-
从堆(heap)上分配
在程序运行期间,用动态内存分配函数来申请的内存都是从堆上分配的,动态内存的生存期由程序员自己来决定
-
分配内存的两大主要方式
-
void* malloc(unsigned int size);向系统申请大小为size的内存块
把首地址返回,若申请不成功则返回NULL
-
例如:
1
2
3int *pi = NULL;
Pi = (int *)malloc(sizeof(int)); -
void* calloc(unsigned int num,unsigned int size);向系统申请num个size大小的内存块
把首地址返回,若申请不成功则返回NULL
-
例如:
1
2
3float *pf = NULL;
pf =(float *)calloc(10,sizeof(float));
需要头文件:
#include <stdlib.h>#include <alloc.h>注:void* 类型的指针可以指向任意类型的变量,通常强转(Type*)为其他类型
-
-
清除内存分配:
void free(void* p);释放由
malloc()和calloc()申请的内存块-
p是指向此块内存的指针
-
free时系统标记此块内存为未占用,可被重新分配
-
-
改变分配内存的存储空间方式:
void* realloc(void* p , unsigned int size);-
改变原来分配的存储空间的大小
-
p是指向此块内存的指针,size是新内存块的大小
-
函数返回新分配存储空间首地址,与原来分配的首地址不一定相同
-
-
-
一维动态数组的创建
创建一个长度为n的动态数组并输入
1
2
3
4
5
6
7
8
9
10
11
12p=(int*)malloc(n*sizeof(int));
//p=(int *)calloc(n,sizeof(int));
if(p==NULL)//确保指针使用前是非空指针
{
printf("No enough memory!\n");
exit(1);
}
for(int i=0;i<n;i++)
{
scanf("%d",&p[i]);
}
free(p);//释放向系统申请的存储空间 -
二维动态数组的创建
创建一个长度为n的动态数组并输入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17p=(int *)malloc(n*m*sizeof(int));
//p=(int*)calloc(n*m,sizeof(int));
//得到的p为int* 类型,所以为列指针
if(p==NULL)//确保指针使用前是非空指针
{
printf("No enough memory!\n");
exit(1);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&p[i*n+j]);
}
}
free(p);//释放向系统申请的存储空间