15.指针深入学习_C【郝斌C语言入门学习】
专题:动态内存分配(影响java,C#高级语言的学习)
1.传统数组的缺点
1)数组长度必须事先制定,且只能是长整数,不能是变量
int a[5];//正确
int len = 5; int a[len];//错误
2)传统形式定义的数组,该数组的内存无法手动释放
数组一旦定义,系统就会为该数组分配的内存空间就会一直存在,除非数组所在的函数运行结束
在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕,数组的空间才会系统释放。
1 # include <stdio.h> 2 void f(void) 3 { 4 int a[5] = {1, 2, 3, 4, 5}; 5 //20个字节的存储空间程序员无法手动释放它,它只能在本函数运行完毕时由系统自动释放 6 } 7 int main(void) 8 { 9 return 0; 10 }
3)数组的长度一旦定义,其长度不能更改
数组的长度不能在函数运行的过程中动态扩充或缩小
4)A函数定义的数组,在A函数运行期间可以被其它函数使用,但A函数运行完毕,A函数中的数组将无法被其它函数使用
传统方式定义的数组不能跨函数使用
1 # include <stdio.h> 2 void g(int * pArr, int len) 3 { 4 pArr[2] = 88; 5 } 6 void f(void) 7 { 8 int a[5] = {1, 2, 3, 4, 5}; 9 //20个字节的存储空间程序员无法手动释放它,它只能在本函数运行完毕时由系统自动释放 10 g(a, 5); 11 } 12 int main(void) 13 { 14 f(); 15 return 0; 16 }
2.为什么需要动态内存
动态数组很好地解决传统数组的缺陷,传统数组也叫静态数组。
3.动态内存分配举例,动态数组的构造
malloc是 memory(内存) allocate(分配)的缩写
例题:
1 # include <stdio.h> 2 # include <malloc.h> 3 int main(void) 4 { 5 int i = 5;//分配了4个字节,静态分配 6 int * p = (int *)malloc(4); 7 /* 8 1.要使用malloc函数,必须添加malloc.h这个头文件。 9 2.malloc函数只有一个形参,并且是整形。 10 3.4表示请求系统为本程序分配4个字节。 11 4.malloc函数只能返回第一个字节的地址。 12 5.(int *)将malloc()函数返回第一字节的地址强行转换成整形变量的地址。 13 6.int * p = (int *)malloc(4);分配了8个字节,p变量占4个字节,p所指向的内存也占4个字节。 14 7.p本身所占的内存是静态分配,p所指向的内存是动态分配。 15 16 */ 17 *p = 5;//*p代表的就是一个int变量,只不过*p和i这个整形变量的内存分配方式不同 18 free(p); 19 //free(p)表示把p所指向的内存给释放,p本身的内存是静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数终止时释放 20 printf("同志们好!\n"); 21 return 0; 22 }
例题:
1 # include <stdio.h> 2 # include <malloc.h> 3 void f(int * q) 4 { 5 *q = 200; 6 // free(q);//把q所指向的内存释放掉,本语句必须要注销掉,否则会导致下面语句出错 7 } 8 int main(void) 9 { 10 int * p = (int *)malloc(sizeof(int));//sizeof(int)返回值是int所占的字节数 11 *p = 10; 12 printf("%d\n", *p);//10 13 f(p); 14 printf("%d\n", *p);//200 15 return 0; 16 } 17 /* 18 ----------------------------------------------- 19 在vc++6.0中的输出结果:: 20 10 21 200 22 ----------------------------------------------- 23 */
例题:动态构造一个一维数组
1 # include <stdio.h> 2 # include <malloc.h> 3 int main(void) 4 { 5 int i; 6 int a[5]; 7 //如果int占4个字节的话,则本数组总共包含有20个字节,每4个字节被当做了一个int变量来使用 8 int len; 9 //动态的构造一维数组 10 printf("请输入你要存放的元素的个数:"); 11 scanf("%d", &len); 12 int * pArr = (int *)malloc(4*len); 13 //类似于 int pArr[len],本行动态构造了一个一维数组,一维数组的长度是len,一维数组的每一个元素是int类型。 14 //对一维数组进行操作 15 for (i=0; i<len; i++) 16 { 17 scanf("%d", &pArr[i]); 18 } 19 //对一维数组进行输出 20 printf("一维数组的内容是:\n"); 21 for (i=0; i<len; i++) 22 { 23 printf("%d ", pArr[i]); 24 } 25 free(pArr);//释放掉动态分配的数组 26 return 0; 27 }
4.静态内存和动态内存的比较
5.跨函数使用内存的问题

浙公网安备 33010602011771号