You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

正确答案分析

先拆解内存分配逻辑:

  1. 首先通过malloc分配了一块能存n个double*指针的内存,让mat指向这块内存。
  2. 仅给*mat(即mat[0])分配了一块n*n大小的double类型内存块。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:25:24