C: 试图释放 2D 数组本身的程序崩溃
C: Program crashes trying to free 2D array itself
我有一个包含在结构中的二维浮点数组 n
:
float **matrix;
这是动态分配的,使用:
n->matrix = (float**)malloc(n->rows * sizeof(float*));
for (i = 0; i < n->rows; i++) {
n->matrix[i] = (float*)malloc(n->columns * sizeof(float));
}
其中 n->rows
和 n->columns
是预先定义的。
在取消分配时,使用了以下函数:
void de_allocate(float** matrix, int nrows) {
int row;
for (row = 0; row < nrows; row++) {
free(matrix[row]);
}
free(matrix);
}
程序在取消分配过程中成功通过了 for 循环,但给出了 HEAP CORRUPTION DETECTED [location of error]. CRT detected that the application wrote to memory after end of heap buffer
。
请注意,我只是想释放 n->matrix
的内存,而不是结构本身。
这让我觉得 n->data
的长度与 free()
方法期望并试图覆盖的长度不同,但我 none 太确定了。
知道是什么导致了这个问题吗?
不知道问题发生的确切时间,可能很难追踪。你可以做的是:
运行 通过 valgrind
的应用程序 - 它不仅会告诉您问题发生的时间,还会告诉您问题发生的时间/方式。
确保应用程序在执行异常操作时崩溃 - -fsanitize=address
或 -fsanitize=undefined
可能会有所帮助。
我有一个包含在结构中的二维浮点数组 n
:
float **matrix;
这是动态分配的,使用:
n->matrix = (float**)malloc(n->rows * sizeof(float*));
for (i = 0; i < n->rows; i++) {
n->matrix[i] = (float*)malloc(n->columns * sizeof(float));
}
其中 n->rows
和 n->columns
是预先定义的。
在取消分配时,使用了以下函数:
void de_allocate(float** matrix, int nrows) {
int row;
for (row = 0; row < nrows; row++) {
free(matrix[row]);
}
free(matrix);
}
程序在取消分配过程中成功通过了 for 循环,但给出了 HEAP CORRUPTION DETECTED [location of error]. CRT detected that the application wrote to memory after end of heap buffer
。
请注意,我只是想释放 n->matrix
的内存,而不是结构本身。
这让我觉得 n->data
的长度与 free()
方法期望并试图覆盖的长度不同,但我 none 太确定了。
知道是什么导致了这个问题吗?
不知道问题发生的确切时间,可能很难追踪。你可以做的是:
运行 通过
valgrind
的应用程序 - 它不仅会告诉您问题发生的时间,还会告诉您问题发生的时间/方式。确保应用程序在执行异常操作时崩溃 -
-fsanitize=address
或-fsanitize=undefined
可能会有所帮助。