第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 }