码迷,mamicode.com
首页 > 其他好文 > 详细

编译预处理和动态存储分配(2)

时间:2016-04-20 00:19:42      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

2 动态存储分配

  在此之前,我们用于存储数据的变量和数组都必须在说明部分进行定义。C编译程序通过定义语句了解它们所需存储空间的大小,并预先为其分配适当的内存空间。这些空间一经分配,在变量或数组的生存期内是固定不变的。故称这种分配方式为“静态存储分配”。

  C语言中还有一种称作“动态存储分配”的内存空间分配方式:在程序执行期间需要空间来存储数据时,通过“申请”得到指定的内存空间;当有闲置不用的空间时,可以随时将其释放。用户可以通过调用C语言提供的标准库函数来实现动态分配,从而得到指定数目的内存空间或释放指定的内存空间。

  ANSI C标准为动态分配系统定义了四个函数:malloc、calloc、free、realloc。使用这些函数时,必须在程序开头包含头文件 stdlib.h。

  2.1 malloc 函数和 free 函数

  2.1.1 malloc 函数

  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));

  这是一种常用形式。此时将由系统来计算指定类型的字节数,采用这种形式将有利于程序的移植。

  2.1.2 free 函数

  函数的调用形式为:

    free(p);

  这里指针变量 p 必须指向由动态分配函数 malloc 或 calloc 分配的地址。free 函数将指针 p 所指的存储空间释放,使这部分空间可以由系统重新支配。此函数没有返回值。

  2.2 calloc 函数

  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 函数释放。

  2.3 编写程序,利用malloc函数开辟动态存储单元,存放输入的三个整数,然后按从小到大顺序输出这三个数。

技术分享
 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 }
MALLOC

 

编译预处理和动态存储分配(2)

标签:

原文地址:http://www.cnblogs.com/web1013/p/5406282.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!