【发布时间】:2021-12-20 07:44:31
【问题描述】:
我在标头中有一个结构 (ex3.h)
typedef struct matrix {
double **data;
size_t n_rows;
size_t n_columns;
} matrix;
在 c 文件中,我有函数“create_matrix”和另一个函数切片 我在某些地方收到警告“局部变量可能指向已释放的内存”。我在 cmets 中将它们标记为“--->”
#include <stdlib.h>
# include <stdio.h>
# include "ex3.h"
#define DEBUG
matrix *create_matrix (size_t n_rows, size_t n_columns)
{
matrix *mat = malloc (sizeof (matrix));
if (!mat)
{
fprintf (stderr, POINTER_ERROR);
return NULL;
}
if (n_rows == ZERO || n_columns == ZERO)
{ mat->data = NULL, mat->n_rows = ZERO, mat->n_columns = ZERO; }
else
{
{
double **mat_data = malloc (n_rows * sizeof (double *));
if (!mat_data)
{
free (mat);
fprintf (stderr, POINTER_ERROR);
return NULL;
}
for (int i = ZERO; i < n_rows; i++)
{
mat_data[i] = malloc (n_columns * sizeof (double));
if (!mat_data[i])
{
for (int k = ZERO; k < i; k++)
{
free (mat_data[k]);
}
free (mat_data), free (mat);
fprintf (stderr, POINTER_ERROR);
return NULL;
}
else
{
for (int j = ZERO; j < n_columns; j++)
{
mat_data[i][j] = (double) ZERO;
}
}
}
mat->data = mat_data, mat->n_rows = n_rows, mat->n_columns = n_columns;
}
}
return mat;
}
matrix *slice (matrix *mat, size_t row_start,
size_t row_end, size_t col_start, size_t col_end)
{
"some condions..."
{
matrix *m = create_matrix (ZERO, ZERO); //nul matrix
if (!m) "<---"
{
return NULL;
}
return m; "<---"
}
else
{
size_t row = row_end - row_start, col = col_end - col_start;
matrix *new_mat = create_matrix (row, col);
if (!new_mat)"<---"
{
return NULL;
}
for (int i = ZERO; i < row; i++)
{
for (int j = ZERO; j < col; j++)
{
"--->" (new_mat->data)[i][j] = mat->data[i + row_start][j + col_start];
}
}
return new_mat; "<---"
}
}
我做了一些条件来确保我不会尝试去内存空间中不属于我的矩阵的空间,那么为什么 clion 仍然发出警告 感谢您的帮助!
【问题讨论】:
-
乍一看,您的代码似乎正在返回分配的空间或空指针,并在适当的位置检查空指针。这表明报告错误的工具可能是错误的,或者您使用它的源代码可能与您发布的不同。编辑问题以包含minimal reproducible example。将所有代码放在一个序列中,而不是单独的块,这样读者就不必一起编辑片段来编译它们,并在源代码中包含所有必要的语句,例如
#include <stdio.h>和#include <stdlib.h>... -
… 然后减少代码;删除不需要重现问题的语句,例如一些没有错误的
if/else子句。然后确保您在此处粘贴的代码正是获取消息的代码。此外,请说明报告错误消息的工具的名称和版本号。那不是克莱恩; CLion 是一个集成开发环境。它就像一个工具箱,可以包含各种工具,它是其中一种工具,而不是 CLion,它会报告错误。该工具可能是编译器或一些代码检查器。 -
另外,您不能在代码样式中使用**来标记粗体文本。在代码段内,通常的标记字符被禁用,因为它们可能作为源代码的一部分出现。您可以在源代码中添加 cmets 以显示错误消息出现的位置,例如
// The following line gets an error message.。 -
new_mat 大小:row_end-row_start+1 列同上
-
@ptitXav 这是新行 = [开始,结束)
标签: c matrix memory malloc clion