免费的multidimension char **在C中无法正常工作

时间:2016-06-21 18:19:26

标签: c arrays free

我有这个功能:

char** init_matrix(int rows, int columns){
    char **matrix = (char **)malloc (rows*sizeof(char *));
    for(int i = 0; i < rows; i++){
        matrix[i] = (char *) malloc (columns*sizeof(char));
        for(int j = 0; j < columns; j++){
            matrix[i][j] = '-';
        }
    }
    return matrix;
}

void show_matrix(char **matrix, int rows, int columns){
    printf("\n\n");
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < columns; j++)
           printf("|%c|", matrix[i][j]);
        printf("\n");
        for(int j = 0; j < columns; j++)
            printf("---");
        printf("\n");
    }
}

void setValueInMatrix(char** matrix, int row, int column, char value){
    matrix[row][column] = value;
}

然后我这样做

char **matrix = init_matrix(rows, columns);
setValueInMatrix(matrix, solucion->row, solucion->column, solucion->aminoacido);
printf("matrix before free\n");
show_matrix(matrix, rows, columns);
    for(int i = 0; i < rows; i++){
        free(matrix[i]);
    }
    free(matrix);
printf("matrix after free\n");
show_matrix(matrix, rows, columns);

为什么免费之前和之后的输出是相同的? :S

输出:

matrix before free


|-||-||-||H||-||-||-|
---------------------
|-||-||-||P||-||-||-|
---------------------
|-||-||-||P||-||-||-|
---------------------
|-||-||-||H||-||-||-|
---------------------
|-||-||-||-||-||-||-|
---------------------
|-||-||-||-||-||-||-|
---------------------
|-||-||-||-||-||-||-|
---------------------
matrix after free


|-||-||-||H||-||-||-|
---------------------
|-||-||-||P||-||-||-|
---------------------
|-||-||-||P||-||-||-|
---------------------
|-||-||-||H||-||-||-|
---------------------
|-||-||-||-||-||-||-|
---------------------
|-||-||-||-||-||-||-|
---------------------
|-||-||-||-||-||-||-|
---------------------

我已经阅读了所有这些帖子,但它看起来不起作用:

  1. C: Correctly freeing memory of a multi-dimensional array

  2. how to free c 2d array

  3. how to properly free a char **table in C

  4. How to properly free char** in C

2 个答案:

答案 0 :(得分:3)

  

为什么在免费

之前和之后输出相同
  • 这是undefined behaviour

  • 一旦你释放了记忆,你必须记住不再使用它。

  • 致电后

    free(matrix);
    

你得到相同的输出,因为在你的情况下

  

matrix 仍然指向相同的内存

但是,由于matrix已被释放,现在可以再次使用

  

注意: matrix在释放后可能会或可能不会指向相同的块,它的未定义的行为但是,在您的情况下它确实指向同一块

在此处了解更多:click

要避免这种情况,请在释放时指定NULL指针。这是一个很好的做法。

matrix=NULL;

答案 1 :(得分:2)

输出相同,因为free将内存标记为空闲(可重用)。它不会物理擦除内存。

但是在释放它之后使用指针是代码不应该做的事情,因为你正在读/写可能为不同目的而分配的内存。

一旦你&#34;免费&#34;内存你必须将指针变量(矩阵)视为无效。类似地,在同一个指针上两次调用free()被称为双重释放,会导致程序崩溃或导致其他不良行为。

许多人在将指针变量释放后将其设置为NULL以防止意外重用。

像C&#39;中的很多东西一样。语言规范允许您违反规则,但这样做是危险的。