一、在学习c语言里面,内存分配这个话题非常有意思,因为我们平时在开发的时候,如果一不小心没注意内存释放的话,写的的程序很容易出错,所以今天就来回顾一下c语言里面的内存动态分配,下面我们先来看一个实例来进行分析
1 #include <stdio.h> 2 #include <malloc.h> 3 int main(void) 4 { 5 int a[5] = {4, 10, 2, 8, 6}; 6 int len; 7 printf("请输入数组的长度大小:len= "); 8 scanf("%d",&len); 9 int * pArr = (int *)malloc(sizeof(int) * len); 10 *pArr =4; 11 pArr[1] =10;a 12 printf("%d %d\n", *pArr, pArr[1]); 13 free(pArr); 14 15 return 0; 16 }
程序代码说明:
1、(int *)malloc(sizeof(int) * len)这句话的意思是:
a、这里使用了函数sizeof返回数据类型为int 的数组字节个数,同时这里要注意我们这里写的malloc函数只有一个形参,表示要求系统分配的字节数
b、malloc函数的功能是请求系统sizeof(int) * len个字节的内存空间,如果请求分配成功的话,则返回第一个字节的地址,如果分配不成功的话,则返回NULL。
c、malloc函数能且只能返回第一个字节的地址,所以我们需要把这个无实际意义的第一个字节的地址(俗称干地址)转化为有实际意义的地址,所以malloc函数前面必须加(数据类型 *),表示把这个无实际意义的地址转为相应数据类型的地址。
d、所以这里这句话的意思是把系统分配好的20个字节的第一个字节的地址转为四个字节,这样p就指向了第一个的四个字节,pArr+1就指向了第2个的四个字节,pArr+i就指向了第i+1个的四个字节。pArr[0]就是第一个元素,pArr[i]就是i+1个元素
2、通过上面的分析,上面的代码*pArr=4(也可以写成a[0]=4),pArr[1]=10(也可以写成a[1]=10),同时在分配了20个字节的系统内存后,使用了free()函数进行了释放内存,这样就不会造成系统内存的浪费
3、最终结果为:
二、接下来我使用for循环来访问数组,代码如下:
1 #include <stdio.h> 2 #include <malloc.h> 3 int main(void) 4 { 5 int a[5] = {4, 10, 2, 8, 6}; 6 int len; 7 int i=0; 8 printf("请输入数组的大小:len= "); 9 scanf("%d",&len); 10 int * pArr = (int *)malloc(sizeof(int) * len); 11 for( i=0; i<len;++i) 12 { 13 scanf("%d",&pArr[i]); 14 } 15 for(i=0;i<len;++i) 16 { 17 printf("%d\n",*(pArr+i)); 18 } 19 free(pArr); 20 21 return 0; 22 }
运行结果如下:
三、跨函数使用内存例子:
1 #include <stdio.h> 2 #include <malloc.h> 3 struct student 4 { 5 int sid; 6 int age; 7 }; 8 struct student * creatstudent(void); 9 void showstudent(struct student *); 10 int main(void) 11 { 12 struct student *ps ; 13 ps=creatstudent(); 14 showstudent(ps); 15 16 free(ps); 17 return 0; 18 } 19 void showstudent(struct student *pst) 20 { 21 printf("%d %d\n",pst->sid, pst->age); 22 } 23 struct student * creatstudent(void) 24 { 25 struct student * p =(struct student *)malloc(sizeof(struct student)); 26 p->sid=99; 27 p->age=21; 28 return p; 29 }
运行效果如下:
程序说明:
这里我们通过建立函数来分配内存单元,来达到内存灵活分配使用。