第38课 - 动态内存分配

第38课 - 动态内存分配

1. 动态内存分配的意义

(1)C语言中的一切操作都是基于内存的

(2)变量和数组都是内存的别名

内存分配由编译器在编译期间决定

定似数组的时候必须指定数组长度

数组长度是在编译器就必须确定的

 

需求 : 程序运行的过程中,可能需要使用一些额外的内存空间

2. malloc 和 free

(1)malloc和free用于执行动态内存分配和释放

(2)malloc所分配的是一块连续的内存

(3)malloc以字节为单位并且不带

 

3. malloc/calloc/realloc三兄弟

前面已经介绍了malloc函数,这一节介绍一下calloc函数和realloc函数。

(1)calloc函数    ==>  在堆上分配一段内存空间,与malloc不同的是,calloc会将分配的内存空间初始化为0

函数原型: void *calloc(size_t  nmemb,  size_t  size);

函数参数:在程序的堆空间上分配nmemb个长度为size的连续空间,即分配的内存大小为 nmemb * size。与malloc函数不同的是,calloc会将分配的内存空间初始化为0。

函数返回值:

  • 成功返回分配的动态内存的起始地址
  • 失败返回NULL
  • 如果 nmemb 或 size 为0,返回NULL或一个指针,只不过这个指针对应的内存长度为0

malloc的m我知道是memory的意思,calloc的c不知道是什么意思。。。Google搜索了一下 What does the first “c” stand for in “calloc”?

(2)realloc函数    ==>  重新在堆上分配一块size大小的内存空间,并将ptr指向的内存空间内容拷贝到这块新的内存空间,并释放掉ptr指向的内存空间(在realloc之后就不能再使用ptr指向的内存空间了)

函数原型:void *realloc(void *ptr,  size_t  size);

函数参数:ptr为需要重新分配内存空间的指针,它是之前malloc、calloc、realloc函数的返回值;size为新的内存空间的大小

函数返回值:

  • 成功返回新分配的动态内存空间的起始地址
  • 失败返回 NULL
  • 如果传入的 ptr 为NULL,等价于 malloc(size)
  • 如果传入的ptr不等于NULL且size为0,等价于 free(ptr)

【calloc和realloc的使用】

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define SIZE 5
 5 
 6 int main()
 7 {
 8     int *pI = malloc(SIZE * sizeof(int));
 9     short *pS = calloc(SIZE, sizeof(short));
10 
11     int i;
12     for (i=0; i<SIZE; i++) {
13         /*
14             在Linux上,malloc的打印也为0,这个只是编译器的特性,不写写依赖编译器的代码,不具有可移植性
15             在Windows上,malloc的打印就是随机值
16             calloc的打印在Linux和Windows上都为0
17         */
18         printf("pI[%d] = %d, pS[%d] = %hd\n", i, pI[i], i, pS[i]);
19     }
20 
21     printf("Before: pI = %p\n", pI);  // Before: pI = 0x23b7010
22 
23     pI = realloc(pI, 2 * SIZE * sizeof(int));
24 
25     printf("After: pI = %p\n", pI);   // After: pI = 0x23b7050
26                                       // 可以看到使用realloc重新申请内存后,pI的值变了
27 
28     for (i=0; i < 2*SIZE; i++) {
29         printf("pI[%d] = %d\n", i, pI[i]);
30     }
31 
32     return 0;
33 }
posted @ 2019-11-13 23:08  Hengs  阅读(246)  评论(0编辑  收藏  举报