标签:
在此之前,我们用于存储数据的变量和数组都必须在说明部分进行定义。C编译程序通过定义语句了解它们所需存储空间的大小,并预先为其分配适当的内存空间。这些空间一经分配,在变量或数组的生存期内是固定不变的。故称这种分配方式为“静态存储分配”。
C语言中还有一种称作“动态存储分配”的内存空间分配方式:在程序执行期间需要空间来存储数据时,通过“申请”得到指定的内存空间;当有闲置不用的空间时,可以随时将其释放。用户可以通过调用C语言提供的标准库函数来实现动态分配,从而得到指定数目的内存空间或释放指定的内存空间。
ANSI C标准为动态分配系统定义了四个函数:malloc、calloc、free、realloc。使用这些函数时,必须在程序开头包含头文件 stdlib.h。
ANSI C标准规定 malloc 函数返回值类型为 void*,函数的调用形式为:malloc(size)。要求 size 的类型为 unsigned int。
malloc 函数用来分配 size 个字节的存储区,返回一个指向存储区首地址的基类型为 void 的地址。若没有足够的内存单元供分配,函数返回空(NULL)。
假设 short int 型数据占2字节、float 型数据占4字节存储单元,则以下程序段将使 pi 指向一个 short int 类型的存储单元,使 pf 指向一个 float 类型的存储单元:
short int *pi;
float *pf;
pi = (short*)malloc(2);
pf = (float*)malloc(4);
if (pi != NULL) *pi = 6;
if (pf != NULL) *pf = 3.8;
由于在 ANSI C 中 malloc 函数返回的指针为 void*(无值型),故在调用函数时,必须利用强制类型转换将其转成所需的类型。上面的程序段中,调用 malloc 函数时括号中的 * 号不可少,否则就转换成普通变量类型而不是指针类型了。
由动态分配得到的存储单元没有名字,只能靠指针来引用它。一旦指针改变指向,元存储单元及所存储数据都将无法再引用。通过 malloc 函数所分配的动态存储单元中没有初值。
在动态申请存储空间时,若不能确定数据类型所占字节数,可以使用 sizeof 运算符来求得。
例如:
pi = (int*)malloc(sizeof(int));
pf = (float*)malloc(sizeof(float));
这是一种常用形式。此时将由系统来计算指定类型的字节数,采用这种形式将有利于程序的移植。
函数的调用形式为:
free(p);
这里指针变量 p 必须指向由动态分配函数 malloc 或 calloc 分配的地址。free 函数将指针 p 所指的存储空间释放,使这部分空间可以由系统重新支配。此函数没有返回值。
ANSI C 标准规定 calloc 函数返回值的类型为 void*,函数的调用形式为:
calloc(n, size);
要求 n 和 size 的类型都为 unsigned int。
calloc 函数用来给 n 个同一类型的数据项分配连续的存储空间,每个数据项的长度为 size 个字节。若分配成功,函数返回存储空间的首地址;否则返回空。通过调用 calloc 函数所分配的存储单元,系统自动赋初值为0。例如:
char *ps;
ps = (char*)calloc(10, sizeof(char));
以上函数调用语句开辟了10个连续的 char 类型的存储单元,由 ps 指向存储单元的首地址。每个存储单元可以存放一个字符。
使用 calloc 函数动态开辟的存储单元相当于开辟了一个一维数组。函数的第一个参数决定了一维数组的大小;第二个参数决定了数组元素的类型。函数的返回值就是数组的首地址。使用 calloc 函数开辟的动态存储单元,可以用 free 函数释放。
1 #include <stdio.h> 2 #include <stdlib.h> //malloc函数所在头文件 3 4 //交换函数,将三个整数按从小到大顺序排列 5 void Exchange(int *pS, int *pM, int *pB); 6 7 //main函数 8 int main() 9 { 10 int *p1, *p2, *p3; 11 p1 = (int*)malloc(sizeof(int)); 12 p2 = (int*)malloc(sizeof(int)); 13 p3 = (int*)malloc(sizeof(int)); 14 15 printf("Please enter three integer numbers.\n"); 16 17 if(p1 != NULL && p2 != NULL && p3 != NULL) 18 { 19 scanf("%d%d%d", p1, p2, p3); 20 //调用交换函数 21 Exchange(p1, p2, p3); 22 23 //*p1 < *p2 < *p3 24 printf("%d %d %d", *p1, *p2, *p3); 25 } 26 //释放动态存储空间 27 free(p1); 28 free(p2); 29 free(p3); 30 return 0; 31 } 32 33 void Exchange(int *pS, int *pM, int *pB) 34 { 35 int nn; //中间变量 36 37 if (*pS > *pM) 38 { 39 nn = *pS; 40 *pS = *pM; 41 *pM = nn; 42 } 43 if (*pS > *pB) 44 { 45 nn = *pS; 46 *pS = *pB; 47 *pB = nn; 48 } 49 if (*pM > *pB) 50 { 51 nn = *pM; 52 *pM = *pB; 53 *pB = nn; 54 } 55 }
标签:
原文地址:http://www.cnblogs.com/web1013/p/5406282.html