我有这个功能:
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||-||-||-|
---------------------
|-||-||-||-||-||-||-|
---------------------
|-||-||-||-||-||-||-|
---------------------
|-||-||-||-||-||-||-|
---------------------
我已经阅读了所有这些帖子,但它看起来不起作用:
答案 0 :(得分:3)
为什么在免费
之前和之后输出相同
一旦你释放了记忆,你必须记住不再使用它。
致电后
free(matrix);
你得到相同的输出,因为在你的情况下
matrix
仍然指向相同的内存。
但是,由于matrix
已被释放,现在可以再次使用
注意:
matrix
在释放后可能会或可能不会指向相同的块,它的未定义的行为但是,在您的情况下它确实指向同一块
在此处了解更多:click
要避免这种情况,请在释放时指定NULL
指针。这是一个很好的做法。
matrix=NULL;
答案 1 :(得分:2)
输出相同,因为free将内存标记为空闲(可重用)。它不会物理擦除内存。
但是在释放它之后使用指针是代码不应该做的事情,因为你正在读/写可能为不同目的而分配的内存。
一旦你&#34;免费&#34;内存你必须将指针变量(矩阵)视为无效。类似地,在同一个指针上两次调用free()被称为双重释放,会导致程序崩溃或导致其他不良行为。
许多人在将指针变量释放后将其设置为NULL以防止意外重用。
像C&#39;中的很多东西一样。语言规范允许您违反规则,但这样做是危险的。