
变量和数组的存储空间的分配有两种方式:静态存储分配和动态存储分配。 变量和数组的静态存储分配方式
(1) int x,y;
(2) int a[10];
(3) char b[20],*p=b;
(4) double c[M][N]={{0}};
变量和数组的动态存储分配方式
需要调用的系统函数:malloc()、calloc()、realloc()
这些函数的原型声明在stdlib.h中。
malloc()函数原型格式
void* malloc(unsigned int k);
功能:调用它时能够动态分配k个字节的存储空间,返回其首地址,能够赋给任何指针变量。
calloc()函数原型格式
void* calloc(unsigned int n, unsigned int k);
功能:调用它时能够动态分配n*k个字节的存储空间,通常用n表示数组长度,用k表示元素类型的长度,返回其首地址,能赋给任何指针变量。
realloc()函数原型格式
void* realloc(void* ptr, unsigned int k);
功能:调用它时能够动态分配k个字节的存储空间,接着把ptr已经指向的动态存储空间中的内容复制到新分配的存储空间中,返回其首地址,能够赋给任何指针变量。目的是改变ptr指针所指向的动态存储空间的大小。
(1) int *px=malloc(sizeof(int));//动态分配4个字节的存储空间
如:*px=25; *px+=30;//*px就是一个int型变量
(2) double *pa=calloc(10,sizeof(double)); //动态分配10个实数空间
如:*pa=12; pa[i]//pa可作为数组名使用
(3) pa= realloc(pa,20*sizeof(double));//扩大pa的数组长度
(4) int **top=calloc(M+1,sizeof(int*));//因元素为int*类型
//所以返回值应赋给int**类型的指针,此语句同int* top[M+1];
允许在程序运行过程中随时确定待使用的存储空间的大小。
使用变量定义语句定义一个数组时,必须确切地给出数组的每一维的尺寸。
int a[10], b[M][N];
采用动态存储分配方式定义一个数组时,所分配的存储空间的大小可以是常量,也可以是变量。
动态分配长度可变的数组举例
(1) int* a=calloc(10,sizeof(int));//动态存储分配长度为10的数组
(2) int* a=calloc(n, sizeof(int));//动态存储分配长度为n的数组
(3) char* b=malloc(n1+n2);//动态分配长度为n1+n2的字符数组
(4) char** c=calloc(x*y+2,sizeof(char*);//字符指针数组长度为x*y+2
释放动态存储空间的free()函数的原型格式:
void free(void* ptr);
此函数的原型声明包含在系统头文件stdlib.h中。
功能:调用它时能够把指针变量ptr所指向的动态存储空间释放掉,即归还给操作系统。
变量存储分配和释放的程序例子
#include
#include
void main() {
int *a=calloc(10,sizeof(int));
int i;
for(i=0; i<10; i++) a[i]=i*i;
for(i=0; i<10; i++) printf("%d ",a[i]);
free(a);
} //0 1 4 9 16 25 36 49 64 81