1.malloc函数分析

这种分配方式是在程序运行时分配的

它的形参是所需内存的字节大小

它返回那块分配内存的第一个字节的地址

需要把返回值转化为适当的类型

可以像使用数组名一样使用它

2.free函数分析

它的形参是先前malloc返回的地址,即参数多是一个指针

不能是用free释放其他形式的内存分配

这两个函数原型都在stdlib.h中

如果malloc了一个内存块,一定要free,否则容易发生内存泄露

 

  1. #include<stdio.h> 
  2. #include<stdlib.h> 
  3.  
  4. int main(void){ 
  5.     int sizeOfMalloc; 
  6.     int count; 
  7.     int *ptrOfMalloc; 
  8.     int inputNumber; 
  9.     int i = 0;//计数器  
  10.      
  11.     printf("Please enter the size of malloc array:\n"); 
  12.     scanf("%d",&sizeOfMalloc); 
  13.     ptrOfMalloc = (int *)malloc(sizeOfMalloc*sizeof(int)); 
  14.     if(ptrOfMalloc == NULL){//如果分配失败则退出程序  
  15.         puts("Memory allocation failed.GoodBye!"); 
  16.         exit(EXIT_FAILURE); 
  17.     } 
  18.     printf("Please enter %d numbers:\n",sizeOfMalloc); 
  19.     /*for(count=0;count<sizeOfMalloc;count++){ 
  20.         scanf("%d",&inputNumber); 
  21.         ptrOfMalloc[count] = inputNumber; 
  22.     }*/ 
  23.     while(i<sizeOfMalloc && scanf("%d",&ptrOfMalloc[i]) == 1){//一方面保证不越界,另一方面保证输入正确  
  24.         i++; 
  25.     } 
  26.     while(getchar()!='\n')//吃掉垃圾数据  
  27.         continue
  28.     for(count=0;count<sizeOfMalloc;count++){ 
  29.         printf("%d ",ptrOfMalloc[count]); 
  30.         if(count%3 == 2)//每三个数据换一行  
  31.             putchar('\n');  
  32.     } 
  33.     if(count%3 != 0)//最后如果没有换行就换行  
  34.         putchar('\n');  
  35.     printf("Done\n"); 
  36.     free(ptrOfMalloc);//记住释放动态分配的内存  
  37.     getchar(); 
  38.     return 0; 
  39. }  

3.calloc函数

形参有两个,第一个是内存单元的数量,第二个是每个单元以字节计的大小

其他与malloc完全一样

4.malloc声明二维数组

 

  1. int n = 5; 
  2. int m = 6; 
  3. int ar2[n][m];//n*m的变长数组 
  4. int (*p2)[6];// 
  5. int (*p3)[m]; // 
  6. p2 = (int (*)[6])malloc(n*6*sizeof(int));//n*6数组  
  7. p3 = (int (*)[m])malloc(n*m*sizeof(int));//n*m数组  
  8. ar2[1][2] = p2[1][2] = 12; 

5.内存使用

三个独立的部分,分别是

存储外部链接的、内部链接的以及具有空链接的静态变量:编译时就已经知道了,声明周期与程序运行周期相同

存储自动变量:与代码模块声明周期相同,堆栈分配

动态分配内存的:会产生内存碎片,比堆栈内存速度慢