free()如何与malloc()匹配的一个典型例子
以下是源代码,欢迎大家讨论malloc() free()以及动态内存分配泄露的相关问题我也对内存泄露这个问题不是很明白,抛砖引玉了
求101--200之间的所有素数。有很多种做法。这里我们使用malloc()申请动态内存。
下面这两句中,
第二句int *Leap=Leap_begin;是否多余呢??
为什么多定义一个指针变量??
直接使用int *Leap=(int *) malloc(100*sizeof(int));这一句不更简洁吗??
通过我在VC++ 6.0下的运行结果发现:
直接使用int *Leap=(int *) malloc(100*sizeof(int));的话
后面的free(Leap),这句话会带来致命的错误,输出完所有素数之后,对话框给出
一个大大的红色X号, Debug Assertion Failed!
而采用free(Leap_begin)这种方法, 就没问题了!!
int *Leap_begin=(int *) malloc(100*sizeof(int));
int *Leap=Leap_begin;
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void main()
{
int leap=1, i=0, j=0, k=0, h=0;
int *Leap_begin=(int *) malloc(100*sizeof(int));
int *Leap=Leap_begin;
printf("the Leap integars between 101 and 200 are:\n");
for (i=101; i<=200; i++){
leap=1;
k=(int)(sqrt(i));
for (j=2; j<=k; j++){
if (i%j==0){
leap=0; break;}
}
if (leap){
*Leap=i;
h++;
Leap++;
printf("%d ",i);
if (h%10==0)
printf("\n");
}
free(Leap_begin);
}
----------------解决方案--------------------------------------------------------
为什么会出错,那是因为你自己不细心,你用Leap++,Leap已经指到的数组尾了,由于Leap_begin你没有改变它的值所以用它来释放内存是可以的,但Leap不行.
----------------解决方案--------------------------------------------------------