首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

动态分配malloc,与释放free有关问题

2013-07-04 
动态分配malloc,与释放free问题最近在网上看到一个这个分配二维数组的函数,以及其释放函数;其中遇到了几个

动态分配malloc,与释放free问题
最近在网上看到一个这个分配二维数组的函数,以及其释放函数;其中遇到了几个问题:
1. malloc((size_t)((nrow+NR_END)*sizeof(float*))),这句话中size_t的作用;
2. m += 1;m -= nrl;为什么要减去nrl;
3. 在free函数中为什么要用(FREE_ARG);
4. free((FREE_ARG) (m[nrl]+ncl-1));这句话什么意思?

float **matrix(long nrl, long nrh, long ncl, long nch)
/* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */
{
long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
float **m;

/* allocate pointers to rows */
m=(float **) malloc((size_t)((nrow+NR_END)*sizeof(float*)));
if (!m) nrerror("allocation failure 1 in matrix()");
m += 1;
m -= nrl;

/* allocate rows and set pointers to them */
m[nrl]=(float *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float)));
if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
m[nrl] += 1;
m[nrl] -= ncl;

for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;

/* return pointer to array of pointers to rows */
return m;
}
void free_matrix(float **m, long nrl, long nrh, long ncl, long nch)
/* free a float matrix allocated by matrix() */
{
free((FREE_ARG) (m[nrl]+ncl-1));
free((FREE_ARG) (m+nrl-1));
}
malloc sizeof C 矩阵 二维数组
[解决办法]
1、ize_t 强制类型转换;void *malloc( size_t size );
2、数组范围是从nrl到nrh,所以m的起始地址要减去nrl+1;不然m[nrl]的地址就到后面去了。
3、(FREE_ARG)是个宏定义吧,相当于void* ;void free( void *memblock );
4、上面分配地址之后有个 m[nrl] += 1;     m[nrl] -= ncl; 所以。。。
[解决办法]
1. long nrow和size_t运算时自动转换成long而malloc的类型是size_t。
2. m -= nrl;这样看的话是不是malloc的首地址是高位地址啊,不是我们所认为的首地址是低位地址.


3. FREE_ARG声明的像是char *吧。
4. 如果上面的2能通的话,那应该是分配给行的地址。

热点排行