读书人

内存申请完再释放报错

发布时间: 2012-02-12 17:16:34 作者: rapoo

内存申请完再释放报错,高手请进
程序如下
****************************************************
//开辟内存
double*** a = (double***)malloc(4*sizeof(double**));
for(int i = 0; i < 4; i++)
{
a[i] = (double**)malloc(100*sizeof(double*));
for(int j = 0; j < 100; j++)
{
a[i][j] = (double*)malloc(8*sizeof(double));
}
}
//释放内存
for( i = 0; i < 4; i++)
{
for(int j = 0; j < 100; j++)
{
free(a[i][j]);
a[i][j] = NULL;

}
//free(a[i]);//加上就报错
a[i] = NULL;

}
//free(a);//加上就报错
a = NULL;
*****************************************
释放内存的时候加上被注释的两句就报错
//free(a[i]);//加上就报错
//free(a);//加上就报错

[解决办法]

void main()
{
double*** a = (double***)malloc(4*sizeof(double**));
for(int i = 0; i < 4; i++)
{
a[i] = (double**)malloc(100*sizeof(double*));
for(int j = 0; j < 100; j++)
{
a[i][j] = (double*)malloc(8*sizeof(double));
}
}
//释放内存
for( i = 0; i < 4; i++)
{
for(int j = 0; j < 100; j++)
{
free(*(*(a+i)+j));
*(*(a+i)+j) = NULL;

}
//free(a[i]);//加上就报错
free(*(a+i));
*(a+i)= NULL;

}
free(a);
a = NULL;
}
[解决办法]
楼主,我安找你的方法,写的程序可以运行。
#include <stdlib.h>
#include <stdio.h>

void main()
{
double ***a = (double***) malloc(2*sizeof(double**));
for(int i = 0; i < 2; i++)
{
a[i] = (double**)malloc(2*sizeof(double*));
for(int j = 0; j < 2; j++)
{
a[i][j] = (double*)malloc(8*sizeof(double));
}
}

for(i = 0; i < 2; i++)
{
for(int j = 0; j < 2; j++)
{
free(a[i][j]);
a[i][j] = NULL;
}
free(a[i]);
a[i] = NULL;
}
free(a);
a = NULL;

}
楼上的,
a,a[0],a[0][0],它们具体的值是不同,这些跟数组有点差别。
a是第一个分配的地址。
a[0]是第二次分配的地址,
a【0】【0】是第三次分配的地址,
如果它们相同,那么那么说明malloc给你分配的是相同的地址。
[解决办法]
恩不错试验过了
int main()
{double*** a = (double***)malloc(4*sizeof(double**));int i,j;
for(i = 0; i < 4; i++)
{a[i] = (double**)malloc(100*sizeof(double*));
for(j = 0; j < 100; j++)a[i][j] = (double*)malloc(8*sizeof(double));
} /*释放内存*/
for( i = 0; i < 4; i++)for(j = 0; j < 100; j++)free(a[i][j]);
free(a[i]);/*这里没错*/
free(a);/*这里没错*/
//a[i] = NULL; 这个错了吧??能这样写吗?这不是指针!
}

读书人网 >C语言

热点推荐