07_动态分配内存
一、内存的使用
堆(heap)
在程序执行期间分配内存时,内存区域中的这个空间称为堆(heap)。,malloc,calloc
栈(stack)
一般是函数分配给本地的参数和本地变量(局部变量)。
二、动态内存分配malloc函数
在C语言中最简单的内存分配函数是malloc函数,原型如下:
void *malloc( size_t size );
// 字节(BYTE) char 成功将返回分配内存空间的地址值,失败将返回NULL也就是0;
例:
int *pNum=(int*) malloc(100); //分配100字节,也就是25个int类型的空间
三、分配内存时使用sizeof运算符
例:
int *pNum=(int*) malloc(25*sizeof(int)); //分配字节,也就是个int类型的空间
double *pfNum=(double *) malloc(25*sizeof(double ));
四、用指针访问内存
#include <stdio.h> #include <stdlib.h> int main(void) { int *pNum=(int*) malloc(25*sizeof(int)); int i,*p; p=pNum; for (i=0;i<25;i++) { *pNum++=i; } pNum=p; for (i=0;i<25;i++) { printf("%d,", *pNum++); //pNum=pNum+25; } free(*pNum); getchar(); return 0; }
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
五、以数组的形式访问内存
#include <stdio.h> #include <stdlib.h> int main(void) { int *pNum=(int*) malloc(24*sizeof(int)); //3*8,4*6,6*4,2,12 int i; for (i=0;i<25;i++) { pNum[i]=i; } for (i=0;i<25;i++) { printf("%d,", pNum[i]); //pNum=pNum+25; } getchar(); return 0; }
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
1、int (*pNum)[3]=(int (*)[3]) malloc(24*sizeof(int)); 以 pNum[8][3]形式访问内存空间. //8*3 [8][3] int (*pNum)[3]; int i,j,n; n=1; pNum=(int (*)[3])malloc(24*sizeof(int)); for (i=0;i<8;i++) for (j=0;j<3;j++) { pNum[i][j]=n++; } //读取多维数组的值 for (i=0;i<8;i++) for (j=0;j<3;j++) { printf("%d,",pNum[i][j]); } //三维数组 //8*3 [8][3] //10*3*4 int (*pNum)[3][4]; int i,j,k,n; n=1; pNum=(int (*)[3][4])malloc(122*sizeof(int)); for (i=0;i<10;i++) for (j=0;j<3;j++) for(k=0;k<4;k++) { pNum[i][j][k]=n++; } // ////读取多维数组的值 for (i=0;i<10;i++) for (j=0;j<3;j++) for(k=0;k<4;k++) { printf("%d,",pNum[i][j][k]); }
六、calloc函数分配内存
void *calloc( size_t num, size_t size );
int *p=(int*) malloc(25*sizeof(int));
int *p=(int*)calloc(25,sizeof(int);
七、 calloc与malloc的区别
1、参数不同
2、多了初始化内存的功能 0
八、memset函数
void *memset( void *dest, char c, size_t count );
九、 释放动态分配的内存
为什么要释放内存?
1、当动态分配了一些内存时,没有保留对它们的引用,就会出现内存泄漏,些时无法释放内存。这常常发生在循环内部,由于没有释放不再需要的内存,程序会使用越来越多的内存,最终将会占用所有内存。
void free( void *memblock );
//测试
int *p;
while (1)
{
p=malloc(10000);
//其它代码段
//free(p);
}