全站搜索未启用
跳到主要内容

文本五:变量存储空间的动态分配

1. 动态存储分配的概念

变量和数组的存储空间的分配有两种方式:静态存储分配和动态存储分配。 变量和数组的静态存储分配方式

(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中。

2. 动态存储分配函数的原型格式和功能

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指针所指向的动态存储空间的大小。

3. 动态存储分配函数的调用格式举例

(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];

4. 动态存储分配的优点

允许在程序运行过程中随时确定待使用的存储空间的大小。

使用变量定义语句定义一个数组时,必须确切地给出数组的每一维的尺寸。

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

5. 动态存储空间的释放

释放动态存储空间的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

最后修改: 2019年09月26日 Thursday 19:00