C语言中如何正确释放特定分配方式的二维数组mat?
C语言二维数组内存释放问题
我在一道大学C语言旧考题里遇到了内存释放的问题,要释放名为mat的二维数组。我原本以为选项a是正确答案,但实际不是。已知这个二维数组是通过以下代码动态分配的:
double ** mat = 0; mat = ( double** ) malloc( n * sizeof( double* ) ); if (0 == mat) { fprintf( stderr, "Eroare de alocare\n" ); exit( EXIT_FAILURE ); } *mat = ( double* ) malloc( n * n * sizeof( double ) ); if ( *mat == 0 ) { fprintf( stderr, "Eroare de alocare\n" ); exit( EXIT_FAILURE ); } for( i=1; i<n; ++i) { *( mat + i ) = *mat + i * n; }
请问以下哪个选项能正确释放该内存块?
- 选项a:
for( i=0; i<n; ++i ) { free( *( mat + i ) ); *( mat + i ) = 0; } free( mat ); mat = 0;
- 选项b:
free( *mat ); *mat = 0; for( i = 1; i<n; ++i ) { free( *( mat + i ) ); *( mat + i ) = 0; } free( mat ); mat = 0;
- 选项c:
free( *mat ); *mat = 0; free( mat ); mat = 0;
- 选项d:
free( mat ); mat = 0;
正确答案分析
先拆解内存分配逻辑:
- 首先通过
malloc分配了一块能存n个double*指针的内存,让mat指向这块内存。 - 仅给
*mat(即mat[0])分配了一块n*n大小的double类型内存块。 mat[1]到mat[n-1]只是指向*mat内存块的偏移位置,没有单独调用malloc分配独立内存。
对应释放逻辑:
- 选项a:循环释放所有
mat[i],但mat[1]到mat[n-1]不是独立分配的内存块,重复释放会触发未定义行为,错误。 - 选项b:释放
*mat后又释放mat[1]到mat[n-1],属于重复释放无效指针,错误。 - 选项c:先释放唯一的
double类型内存块(*mat指向的区域),再释放mat指向的指针数组,完全匹配分配逻辑,正确。 - 选项d:只释放指针数组,漏掉了
*mat指向的大块内存,造成内存泄漏,错误。
内容的提问来源于stack exchange,提问作者xTitan
相关产品推荐
相关产品推荐

