指针-3(动态内存分配)
专题:
动态内存分配(重点)
传统数组的缺点:
1.数组长度必须事先制定,且只能是常数,不能是变量
例:int a[5];//OK
int len = 5; int a[len]; //error
2.传统形式定义的数组,该数组的内存程序员无法手动释放
在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放
3.数组的长度一旦定义,其长度就不能再改变。数组的长度不能在函数运行的过程中动态的扩充或缩小
4.A函数定义的数组,在A函数运行期间可以被其它函数使用,但A函数运行完毕之后,A函数中的数组将无法在被其它函数使用
传统方式定义的数组不能跨函数使用
为什么需要动态分配内存
动态数组很好的解决了传统数组的4个缺陷;传统数组也叫静态数组
/* malloc 是memory(内存)allocate(分配)的缩写 */ int main() { int i = 5; //9行 int * p = (int *)malloc(4); //10行 /* 1. 要使用malloc函数,必须添加malloc.h这个头文件 2. malloc函数只有一个形参,并且形参是整型 3. 4表示请求系统为本程序分配4个字节 4. malloc函数只能返回第一个字节的地址 5. 10行分配了8个字节,p变量占4个字节,p指向的内存也占四个字节 6. p本身所占的内存是静态分配的,p所指向的内存是动态分配的 */ *p = 5; //*p 代表的就是一个int变量, 只不过*p这个变量的内存分配方式和9行的i变量分配的方式不同 free(p); //free(p)表示把p所指向的内存释放掉 p本身的内存静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数运行终止时由系统自动释放 printf("同志们好!\n"); return 0; }
int * p = &i; //int * p;p = &i;
malloc的第二种用法 #include <stdio.h> #include <stdlib.h> #include <malloc.h> //malloc头文件 void f(int *q ) { //*p = 200; //error //q = 200;//error,因为q是地址 //**q = 200; //error,因为*q是整型变量。而*只能加在指针变量的起前面 *q = 200; //free(q); //把q所知的内存释放掉,本语句必须注释掉,否则会导致20行代码出错 } int main() { int * p = (int *)malloc(sizeof(int)); //sizeof(int)返回值是int所占的字节数;( p指向的是四个字节) *p = 10; printf("%d\n", *p); f(p); //p是int *类型 printf("%d\n", *p); //20行 return 0; }
动态内存分配举例_动态数组的构造
#include <malloc.h> int main() { int a[5]; //如果int占4个字节的话,则本数组共包含有20个字节,每四个字节被当做了一个int变量来使用 int len; int * pArr; int i; //动态的构造一维数组 printf("请输入你要存放的元素的个数:\n"); scanf("%d",&len); pArr = (int *)malloc(4*len); //第12行 本行动态的构造了一个一维数组,该一维数组数组长度是len,该数组的数组名是pArr,该数组的每个元素是int类型, 类似于 int pArr[len] //对一维数组进行操作 如:对动态一维数组进行赋值 for(i=0;i<len;i++) scanf("%d", &pArr[i]); //对一维数组进行输出 printf("一维数组的内容是\n"); for(i=0;i<len;i++) printf("%d\n",pArr[i]); free(pArr); return 0;; }
静态内存和动态内存的比较
静态内存是由系统自动分配,由系统自动释放
静态内存是在栈分配的
动态内存是由程序员手动分配,手动释放
动态内存是在堆分配的
跨行使用内存的问题