1.malloc函数分析
这种分配方式是在程序运行时分配的
它的形参是所需内存的字节大小
它返回那块分配内存的第一个字节的地址
需要把返回值转化为适当的类型
可以像使用数组名一样使用它
2.free函数分析
它的形参是先前malloc返回的地址,即参数多是一个指针
不能是用free释放其他形式的内存分配
这两个函数原型都在stdlib.h中
如果malloc了一个内存块,一定要free,否则容易发生内存泄露
- #include<stdio.h>
- #include<stdlib.h>
- int main(void){
- int sizeOfMalloc;
- int count;
- int *ptrOfMalloc;
- int inputNumber;
- int i = 0;//计数器
- printf("Please enter the size of malloc array:\n");
- scanf("%d",&sizeOfMalloc);
- ptrOfMalloc = (int *)malloc(sizeOfMalloc*sizeof(int));
- if(ptrOfMalloc == NULL){ //如果分配失败则退出程序
- puts("Memory allocation failed.GoodBye!");
- exit(EXIT_FAILURE);
- }
- printf("Please enter %d numbers:\n",sizeOfMalloc);
- /*for(count=0;count<sizeOfMalloc;count++){
- scanf("%d",&inputNumber);
- ptrOfMalloc[count] = inputNumber;
- }*/
- while(i<sizeOfMalloc && scanf("%d",&ptrOfMalloc[i]) == 1){ //一方面保证不越界,另一方面保证输入正确
- i++;
- }
- while(getchar()!='\n')//吃掉垃圾数据
- continue;
- for(count=0;count<sizeOfMalloc;count++){
- printf("%d ",ptrOfMalloc[count]);
- if(count%3 == 2)//每三个数据换一行
- putchar('\n');
- }
- if(count%3 != 0)//最后如果没有换行就换行
- putchar('\n');
- printf("Done\n");
- free(ptrOfMalloc);//记住释放动态分配的内存
- getchar();
- return 0;
- }
3.calloc函数
形参有两个,第一个是内存单元的数量,第二个是每个单元以字节计的大小
其他与malloc完全一样
4.malloc声明二维数组
- int n = 5;
- int m = 6;
- int ar2[n][m];//n*m的变长数组
- int (*p2)[6];//
- int (*p3)[m]; //
- p2 = (int (*)[6])malloc(n*6*sizeof(int));//n*6数组
- p3 = (int (*)[m])malloc(n*m*sizeof(int));//n*m数组
- ar2[1][2] = p2[1][2] = 12;
5.内存使用
三个独立的部分,分别是
存储外部链接的、内部链接的以及具有空链接的静态变量:编译时就已经知道了,声明周期与程序运行周期相同
存储自动变量:与代码模块声明周期相同,堆栈分配
动态分配内存的:会产生内存碎片,比堆栈内存速度慢