C语言中动态内存分配

C语言用了蛮久了,最近在写一个dsp的程序,发现动态内存使用这一块还是很欠缺,于是又重新看了看C的书,总结一下。
之前常见的数组或结构体内存分配,其长度必须是固定的常数,如:int a[10]等,当需要申请变长数组时,常规的直接定义就不可以了,如float b[n],其中n为变量(好像C99之后可以这么做)。
那么这个时候就可以使用malloc与calloc函数,申请动态内存了,这两个函数都在stdlib.h这个头文件里,功能都是申请一段长度的内存,并返回内存首地址,不同点在于:malloc申请的内存段里是随机的数据,而calloc申请的内存全部初始化为0。下面是实际中的用法

1.malloc与calloc

double *aa;
aa=(double *)malloc(n*sizeof(double));
或者 aa=(double *)calloc(n,sizeof(double)); //申请内存,其中n可以是变量
if ( aa == NULL ){
printf(“内存分配失败”);
exit(0);
} //检测是否成功分配内存


free(aa); //释放内存
aa=NULL; //指针指向空,防止野指针

但是在实际使用中我遇到了一些问题:就是在用dsp开发时,我的的确确使用了calloc申请内存,然后free(ptr)和ptr=NULL释放内存,但是发现每次calloc在堆上取的地址仍然会不断增加,增加的地址大小刚好是每次申请的内存大小(我是循环调用calloc),希望懂行的人帮忙分析下原因。

2.realloc

int *p1;
int *p2;
p1=(int *)malloc(n*sizeof(int));
if( p1== NULL ){
exit(1);
printf(“内存分配失败”);
}

p2=(int *)realloc( p1, 2*n*sizeof(int));
if ( p2 == NULL) {
exit(1); //此时p1并未释放
printf(“内存分配失败”);
}


free(p2);
p2=NULL;
如果之前的内存段(p1)空间足够,则返回的继续是p1的地址;如果不够,则返回新地址。
realloc后p1会自动free掉,但是指针仍然不会指向NULL。
总之realloc用起来会比较容易出现内存泄露,所以建议大家充分掌握后再使用

下面是网友总结的一些注意事项,可以参考一下
realloc使用注意事项(这是总结网友们的经验)

  1. realloc失败的时候,返回NULL

  2. realloc失败的时候,原来的内存不改变,也就是不free或不move,(这个地方很容易出错)

  3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址

  4. 如果size为0,效果等同于free()。此时返回的是NULL,原有指针已经被释放掉,不能再用,所以要在realloc后加上判断 if(p2==NULL)

  5. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的。

你可能感兴趣的:(C/C++学习笔记)