C - 使用自由函数时程序崩溃

C - program crashes when using free function

首先,抱歉我的英语不好 jeje。我不会说。

我在使用 free() 函数释放内存时遇到问题,这是我遇到的问题:

我在 Windows 7 上使用代码块。我已经使用动态内存分配大约 3 年了,这是我第一次遇到这个问题。 有人说是gcc编译器的问题

函数内外的方向相同,所以我不认为我在尝试释放无效指针

代码中的错误是:

  • M == NULL 不是检查 malloc 是否成功的有效方法。您应该使用 (*M) == NULL,因为该值分配给 (*M),而不是 M
  • ReservarMemoriaMatrizi<=m中的循环条件似乎有误。应该是 i<=n.
  • 您忘记在 LiberarMemoriaMatriz 中释放 (*M)[n]

更正后的代码:

void LiberarMemoriaMatriz(double*** M,int n){
    int i = 0;
    if(M == NULL) return;
    for(i=0; i<=n; i++){
        free((*M)[i]);
    }
    free(*M);
}

int ReservarMemoriaMatriz(double*** M, int n, int ,){
    int i = 0;
    if(M == NULL) return 0;
    (*M) = malloc((n+1)*sizeof(double*));
    if((*M) == NULL){
        return 0;
    }
    for(i = 0; i<=n; i++){
        (*M)[i] = malloc(m*sizeof(double));
        if((*M)[i] == NULL){
            /* free what is allocated before failing */
            for(i--; i>=0; i--) free((*M)[i]);
            free(*M);
            return 0;
        }
    }
    return 1;
}

你的 for 循环应该在你的第二轮分配中使用 n 而不是 m

for (i=0; i < n; i++) // You're using m here: use n
{
    ...
    malloc(m...) // Here m is correct

我一行一行地找,终于找到了错误:

我喜欢你说的:

free what is allocated before failing

我更改的另一件事是在分配内存时使用:

(*M) = (double**)malloc(n * sizeof(double*));

和循环条件,i < n,一切正常。